diff --git a/.github/test.yml b/.github/test.yml index f863c5e..c600796 100644 --- a/.github/test.yml +++ b/.github/test.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-22.04] - php-versions: ["8.0", "8.1"] + php-versions: ["8.2"] env: extensions: pcov, imagick tools: composer diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 43ed4b7..cc91c01 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: os: [ubuntu-22.04] - php: ["8.1"] + php: ["8.2"] env: tools: composer ini-values: default_charset='UTF-8' diff --git a/.github/workflows/release-free.yml b/.github/workflows/release-free.yml index 0a1978e..016720e 100644 --- a/.github/workflows/release-free.yml +++ b/.github/workflows/release-free.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: ["8.1"] + php-versions: ["8.2"] env: tools: composer ini-values: default_charset='UTF-8' diff --git a/.package/4.4.2.txt b/.package/4.4.2.txt deleted file mode 100644 index a170111..0000000 --- a/.package/4.4.2.txt +++ /dev/null @@ -1,7 +0,0 @@ -Chevereto 4.4.2 (2026-01-06) - -- Fixed bug with "Upgrade now" button display -- Fixed bug in /settings/api route display -- Fixed bug in delete URL not working -- Fixed bug in Free edition missing Follow class -- Fixed API documentation links diff --git a/.package/4.5.0.txt b/.package/4.5.0.txt new file mode 100644 index 0000000..6e52dab --- /dev/null +++ b/.package/4.5.0.txt @@ -0,0 +1,28 @@ +Chevereto 4.5.0 (2026-04-08) + +- Added /_/api/4/auth/verify route +- Added /_/api/4/config/traefik internal HTTP provider route +- Added /_/api/4/tenants/{id}/user-password-reset route +- Added CHEVERETO_ENABLE_GUESTS env for controlling guest interactions +- Added CHEVERETO_SERVICE_NAME env for specifying the service name +- Added CHEVERETO_TRIAL_ENABLE_* keys support for controlling features enabled during trial +- Added CHEVERETO_TRIAL_MAX_* keys support for controlling max limits during trial +- Added CHEVERETO_TRIAL env for controlling trial mode +- Added envTrialAware helper function for accessing trial-aware env variables +- Added version-installed command +- Added login_providers tenant stats +- Added password parameter for password-reset command +- Added port 8080 to the list of allowed ports +- Added support for more email providers: AhaSend, Amazon SES, Azure, Brevo, Infobip, MailerSend, Mailgun, Mailjet, Mailomat, MailPace, Mailtrap, Mandrill, Microsoft Graph, Postal, Postmark, Resend, Scaleway, SendGrid and Sweego +- Bumped minimum PHP version to 8.2 +- Fixed "Powered by" message +- Fixed bug affecting homepage (free edition) +- Fixed bug on /_/api/4/* routes missing error responses +- Fixed bug on Tenants jobs:worker command when passing tenant id +- Fixed bug on Tenants caching system +- Fixed bug on tenants CLI database-migrate command +- Fixed bug preventing Tenant installation +- Fixed missing custom semantics parsing for image route description +- Improved "Something went wrong" error page for both SaaS and self-hosted contexts +- Improved album dropdown options on uploader +- Renamed env variable CHEVERETO_JOBS_WORKER_INTERVAL to CHEVERETO_SCHEDULER_INTERVAL diff --git a/app/bin/tenants b/app/bin/tenants index 878d877..770bf7a 100755 --- a/app/bin/tenants +++ b/app/bin/tenants @@ -246,6 +246,7 @@ if($missingOptions ?? false) { $envDefault = require dirname(__DIR__, 1) . '/env-default.php'; $envVar = array_merge($envDefault, ENV, getCheveretoEnv()); $envVar['CHEVERETO_DB_TABLE_ROOT_PREFIX'] = $envVar['CHEVERETO_DB_TABLE_PREFIX']; +$envVar['CHEVERETO_CACHE_KEY_ROOT_PREFIX'] = $envVar['CHEVERETO_CACHE_KEY_PREFIX']; $envVar['CHEVERETO_DB_TABLE_PREFIX'] .= '_'; // chv__ $envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= '_:'; // chv:_: new EnvVar($envVar); @@ -273,6 +274,7 @@ $redis->connect(env()['CHEVERETO_CACHE_HOST'], (int) env()['CHEVERETO_CACHE_PORT if (env()['CHEVERETO_CACHE_PASSWORD'] !== '') { $redis->auth(env()['CHEVERETO_CACHE_PASSWORD']); } +$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); new EncryptionInstance( new Encryption( new Key(env()['CHEVERETO_ENCRYPTION_KEY']) @@ -494,7 +496,7 @@ $databaseMigrate = function() use ($tenants, $opts, $logger): void { } foreach ($tenantsUpdate as $tenant) { runAppCommand( - command: ['-C', 'database-update'], + command: ['-C', 'database-migrate'], env: array_merge($_ENV, [ 'CHEVERETO_TENANT' => $tenant['id'], ]), @@ -527,7 +529,7 @@ $jobsWorker = function() use ($tenants, $opts, $logger): void { while (true) { $now = time(); if($opts['id'] ?? null) { - $tenantsId = $opts['id']; + $tenantsId = [$opts['id']]; } else { $tenantsId = $tenants->getTenantsIds( ['is_enabled' => true], @@ -539,7 +541,7 @@ $jobsWorker = function() use ($tenants, $opts, $logger): void { } foreach ($tenantsId as $tenantId) { $tenant = $tenants->getTenant($tenantId); - $intervalSec = (int) ($tenant->env['CHEVERETO_JOBS_WORKER_INTERVAL'] ?? 300); + $intervalSec = (int) ($tenant->env['CHEVERETO_SCHEDULER_INTERVAL'] ?? 300); $mustRun = $tenant->lastJobAt === null || (strtotime($tenant->lastJobAt) + $intervalSec) <= $now; if ($mustRun) { @@ -547,11 +549,27 @@ $jobsWorker = function() use ($tenants, $opts, $logger): void { tenantId: $tenantId, lastJobAt: datetimegmt() ); + $commandEnv = array_merge($_ENV, [ + 'CHEVERETO_TENANT' => $tenantId, + ]); + $commandExit = runAppCommand( + command: ['-C', 'version-installed'], + env: $commandEnv, + isVerbose: $isVerbose, + logger: $logger + ); + if($commandExit === 255) { + $logger->write( + << $tenantId, - ]), + env: $commandEnv, isVerbose: $isVerbose, logger: $logger ); diff --git a/app/composer.json b/app/composer.json index 8c67bc6..89e284e 100644 --- a/app/composer.json +++ b/app/composer.json @@ -16,29 +16,27 @@ "composer/package-versions-deprecated": true }, "platform": { - "php": "8.1.28" + "php": "8.2" } }, "require": { - "php": "^8.1", + "php": "^8.2", "intervention/image": "^2.6", "jeroendesloovere/xmp-metadata-extractor": "^2.0", "guzzlehttp/psr7": "^1.7||^2", "aws/aws-sdk-php": "^3.336.15", - "phpmailer/phpmailer": "^6.5", - "psr/cache": "^1", + "psr/cache": "^3.0", "psr/log": "^1||^2||^3", "phpseclib/phpseclib": "^3.0.37", "mobiledetect/mobiledetectlib": "^2.8", "mlocati/ip-lib": "^1.17", "composer/ca-bundle": "^1.2", - "chevere/throwable-handler": "^1.0.2", "pragmarx/google2fa": "^8.0", "pragmarx/google2fa-qrcode": "^3.0", "phpseclib/bcmath_compat": "^2.0", "chillerlan/php-qrcode": "^4.3", - "firebase/php-jwt": "^6.3", - "lychee-org/php-exif": "1.0.2", + "firebase/php-jwt": "^7.0", + "lychee-org/php-exif": "^1.0.2", "p3k/emoji-detector": "^1.0", "php-ffmpeg/php-ffmpeg": "^1.2", "psy/psysh": "^0.11.8", @@ -46,11 +44,32 @@ "chevere/var-dump": "^2.0.7", "chevere/var-support": "^1.0", "matthiasmullie/scrapbook": "^1.0", - "xrdebug/php": "^3.0", "donatj/phpuseragentparser": "^1.11", "chevere/router": "^0.9.1", "chevere/http": "^0.7.1", - "laminas/laminas-httphandlerrunner": "^2.13" + "laminas/laminas-httphandlerrunner": "^2.13", + "chevere/throwable-handler": "^1.0", + "symfony/mailer": "^7.4", + "symfony/http-client": "^7.4", + "symfony/amazon-mailer": "^7.4", + "symfony/aha-send-mailer": "^7.4", + "symfony/azure-mailer": "^7.4", + "symfony/brevo-mailer": "^7.4", + "symfony/infobip-mailer": "^7.4", + "symfony/mailgun-mailer": "^7.4", + "symfony/mailjet-mailer": "^7.4", + "symfony/mailomat-mailer": "^7.4", + "symfony/mail-pace-mailer": "^7.4", + "symfony/mailer-send-mailer": "^7.4", + "symfony/mailtrap-mailer": "^7.4", + "symfony/mailchimp-mailer": "^7.4", + "symfony/microsoft-graph-mailer": "^7.4", + "symfony/postal-mailer": "^7.4", + "symfony/postmark-mailer": "^7.4", + "symfony/resend-mailer": "^7.4", + "symfony/scaleway-mailer": "^7.4", + "symfony/sendgrid-mailer": "^7.4", + "symfony/sweego-mailer": "^7.4" }, "autoload": { "files": [ diff --git a/app/composer.lock b/app/composer.lock index 5d2fddf..b287898 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -4,8 +4,141 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5e2bfdedaf52961199396451f17a71e2", + "content-hash": "43b717369b031292cb23399f2243b065", "packages": [ + { + "name": "async-aws/core", + "version": "1.28.1", + "source": { + "type": "git", + "url": "https://github.com/async-aws/core.git", + "reference": "e8b02ac30b17afaf1352cbd352dceb789d792d39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/async-aws/core/zipball/e8b02ac30b17afaf1352cbd352dceb789d792d39", + "reference": "e8b02ac30b17afaf1352cbd352dceb789d792d39", + "shasum": "" + }, + "require": { + "ext-hash": "*", + "ext-simplexml": "*", + "php": "^8.2", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/http-client": "^4.4.16 || ^5.1.7 || ^6.0 || ^7.0 || ^8.0", + "symfony/http-client-contracts": "^1.1.8 || ^2.0 || ^3.0", + "symfony/service-contracts": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "async-aws/s3": "<1.1", + "symfony/http-client": "5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.42", + "symfony/error-handler": "^7.3.2 || ^8.0", + "symfony/phpunit-bridge": "^7.3.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.28-dev" + } + }, + "autoload": { + "psr-4": { + "AsyncAws\\Core\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Core package to integrate with AWS. This is a lightweight AWS SDK provider by AsyncAws.", + "keywords": [ + "amazon", + "async-aws", + "aws", + "sdk", + "sts" + ], + "support": { + "source": "https://github.com/async-aws/core/tree/1.28.1" + }, + "funding": [ + { + "url": "https://github.com/jderusse", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2026-02-16T10:24:54+00:00" + }, + { + "name": "async-aws/ses", + "version": "1.14.1", + "source": { + "type": "git", + "url": "https://github.com/async-aws/ses.git", + "reference": "8ba4c7f5bbb4d1055f3ebedcf0ea1b8b79393e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/async-aws/ses/zipball/8ba4c7f5bbb4d1055f3ebedcf0ea1b8b79393e5b", + "reference": "8ba4c7f5bbb4d1055f3ebedcf0ea1b8b79393e5b", + "shasum": "" + }, + "require": { + "async-aws/core": "^1.9", + "php": "^8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.42", + "symfony/error-handler": "^7.3.2 || ^8.0", + "symfony/phpunit-bridge": "^7.3.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.14-dev" + } + }, + "autoload": { + "psr-4": { + "AsyncAws\\Ses\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "SES client, part of the AWS SDK provided by AsyncAws.", + "keywords": [ + "amazon", + "async-aws", + "aws", + "sdk", + "ses" + ], + "support": { + "source": "https://github.com/async-aws/ses/tree/1.14.1" + }, + "funding": [ + { + "url": "https://github.com/jderusse", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2026-02-16T10:24:54+00:00" + }, { "name": "aws/aws-crt-php", "version": "v1.2.7", @@ -62,16 +195,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.369.7", + "version": "3.377.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "8678ee11ac680d462fabbecb455112a17aa7728d" + "reference": "573c569d20710a902446688a0439b53fef256e3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8678ee11ac680d462fabbecb455112a17aa7728d", - "reference": "8678ee11ac680d462fabbecb455112a17aa7728d", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/573c569d20710a902446688a0439b53fef256e3a", + "reference": "573c569d20710a902446688a0439b53fef256e3a", "shasum": "" }, "require": { @@ -92,12 +225,12 @@ "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", "composer/composer": "^2.7.8", - "dms/phpunit-arraysubset-asserts": "^0.4.0", + "dms/phpunit-arraysubset-asserts": "^v0.5.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", "ext-sockets": "*", - "phpunit/phpunit": "^9.6", + "phpunit/phpunit": "^10.0", "psr/cache": "^2.0 || ^3.0", "psr/simple-cache": "^2.0 || ^3.0", "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", @@ -135,11 +268,11 @@ "authors": [ { "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" + "homepage": "https://aws.amazon.com" } ], "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", + "homepage": "https://aws.amazon.com/sdk-for-php", "keywords": [ "amazon", "aws", @@ -153,9 +286,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.369.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.377.0" }, - "time": "2026-01-05T19:05:14+00:00" + "time": "2026-04-07T18:14:36+00:00" }, { "name": "chevere/action", @@ -690,68 +823,18 @@ }, "time": "2025-11-27T17:22:51+00:00" }, - { - "name": "chevere/standard", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/chevere/standard.git", - "reference": "bf2b876149b42a93f3bca5a81671f31caf963528" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/chevere/standard/zipball/bf2b876149b42a93f3bca5a81671f31caf963528", - "reference": "bf2b876149b42a93f3bca5a81671f31caf963528", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^9.5", - "symplify/easy-coding-standard": "^11.1" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Chevere\\Standard\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Rodolfo Berrios", - "email": "rodolfo@chevere.org", - "homepage": "https://chevere.org" - } - ], - "description": "A chevere standard package", - "homepage": "https://chevere.org", - "support": { - "issues": "https://github.com/chevere/standard/issues", - "source": "https://github.com/chevere/standard/tree/1.0.1" - }, - "time": "2024-06-01T16:48:38+00:00" - }, { "name": "chevere/throwable-handler", - "version": "1.0.7", + "version": "1.0.10", "source": { "type": "git", "url": "https://github.com/chevere/throwable-handler.git", - "reference": "352e59ac8998d0249a4dc6665ab6cbd465bce6bd" + "reference": "f191d05d83857c24b1485762d9c75fbcefb86312" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chevere/throwable-handler/zipball/352e59ac8998d0249a4dc6665ab6cbd465bce6bd", - "reference": "352e59ac8998d0249a4dc6665ab6cbd465bce6bd", + "url": "https://api.github.com/repos/chevere/throwable-handler/zipball/f191d05d83857c24b1485762d9c75fbcefb86312", + "reference": "f191d05d83857c24b1485762d9c75fbcefb86312", "shasum": "" }, "require": { @@ -789,9 +872,9 @@ "homepage": "https://chevere.org", "support": { "issues": "https://github.com/chevere/throwable-handler/issues", - "source": "https://github.com/chevere/throwable-handler/tree/1.0.7" + "source": "https://github.com/chevere/throwable-handler/tree/1.0.10" }, - "time": "2025-09-12T21:25:18+00:00" + "time": "2026-03-08T13:33:43+00:00" }, { "name": "chevere/trace", @@ -843,21 +926,21 @@ }, { "name": "chevere/var-dump", - "version": "2.0.7", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/chevere/var-dump.git", - "reference": "1d4e2e0e31d1d384f5b4dd71b5962cddf55b43fa" + "reference": "5c865b3435e6dbf88deb124b169301ec353d3fff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chevere/var-dump/zipball/1d4e2e0e31d1d384f5b4dd71b5962cddf55b43fa", - "reference": "1d4e2e0e31d1d384f5b4dd71b5962cddf55b43fa", + "url": "https://api.github.com/repos/chevere/var-dump/zipball/5c865b3435e6dbf88deb124b169301ec353d3fff", + "reference": "5c865b3435e6dbf88deb124b169301ec353d3fff", "shasum": "" }, "require": { + "chevere/data-structure": "^1.1", "chevere/message": "^1.0.0", - "chevere/parameter": "^1.0|^1.1|^1.2", "chevere/writer": "^1.0.3", "kevinlebrun/colors.php": "^1.0", "php": "^8.1" @@ -896,28 +979,28 @@ ], "support": { "issues": "https://github.com/chevere/var-dump/issues", - "source": "https://github.com/chevere/var-dump/tree/2.0.7" + "source": "https://github.com/chevere/var-dump/tree/2.0.10" }, - "time": "2025-11-19T20:06:40+00:00" + "time": "2026-03-06T14:41:19+00:00" }, { "name": "chevere/var-support", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/chevere/var-support.git", - "reference": "f5f9f9b45d1c9815b7041506683cec3e1dff087a" + "reference": "cf109264801a9985f195f1176ef84ff91cc621df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chevere/var-support/zipball/f5f9f9b45d1c9815b7041506683cec3e1dff087a", - "reference": "f5f9f9b45d1c9815b7041506683cec3e1dff087a", + "url": "https://api.github.com/repos/chevere/var-support/zipball/cf109264801a9985f195f1176ef84ff91cc621df", + "reference": "cf109264801a9985f195f1176ef84ff91cc621df", "shasum": "" }, "require": { "chevere/message": "^1.0.0", "php": "^8.1", - "symfony/var-exporter": "^6.1|^7.0" + "symfony/var-exporter": "^6.1|^7.0|^8.0" }, "require-dev": { "phpstan/phpstan": "^1.9", @@ -948,9 +1031,9 @@ "homepage": "https://chevere.org", "support": { "issues": "https://github.com/chevere/var-support/issues", - "source": "https://github.com/chevere/var-support/tree/1.0.1" + "source": "https://github.com/chevere/var-support/tree/1.0.2" }, - "time": "2024-01-08T13:57:44+00:00" + "time": "2026-03-18T16:34:00+00:00" }, { "name": "chevere/writer", @@ -1082,16 +1165,16 @@ }, { "name": "chillerlan/php-settings-container", - "version": "3.2.1", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/chillerlan/php-settings-container.git", - "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681" + "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/95ed3e9676a1d47cab2e3174d19b43f5dbf52681", - "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/a0a487cbf5344f721eb504bf0f59bada40c381b7", + "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7", "shasum": "" }, "require": { @@ -1099,11 +1182,13 @@ "php": "^8.1" }, "require-dev": { + "phan/phan": "^5.5.2", "phpmd/phpmd": "^2.15", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-deprecation-rules": "^1.2", + "phpstan/phpstan": "^2.1.31", + "phpstan/phpstan-deprecation-rules": "^2.0.3", "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.10" + "slevomat/coding-standard": "^8.22", + "squizlabs/php_codesniffer": "^4.0" }, "type": "library", "autoload": { @@ -1128,7 +1213,8 @@ "Settings", "configuration", "container", - "helper" + "helper", + "property hook" ], "support": { "issues": "https://github.com/chillerlan/php-settings-container/issues", @@ -1144,20 +1230,20 @@ "type": "ko_fi" } ], - "time": "2024-07-16T11:13:48+00:00" + "time": "2026-03-20T21:10:52+00:00" }, { "name": "composer/ca-bundle", - "version": "1.5.10", + "version": "1.5.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" + "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", - "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/68ff39175e8e94a4bb1d259407ce51a6a60f09e6", + "reference": "68ff39175e8e94a4bb1d259407ce51a6a60f09e6", "shasum": "" }, "require": { @@ -1204,7 +1290,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.10" + "source": "https://github.com/composer/ca-bundle/tree/1.5.11" }, "funding": [ { @@ -1216,7 +1302,84 @@ "type": "github" } ], - "time": "2025-12-08T15:06:51+00:00" + "time": "2026-03-30T09:16:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" }, { "name": "donatj/phpuseragentparser", @@ -1292,6 +1455,73 @@ ], "time": "2025-09-10T21:58:40+00:00" }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, { "name": "evenement/evenement", "version": "v3.0.2", @@ -1341,16 +1571,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.1", + "version": "v7.0.5", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380", "shasum": "" }, "require": { @@ -1358,6 +1588,7 @@ }, "require-dev": { "guzzlehttp/guzzle": "^7.4", + "phpfastcache/phpfastcache": "^9.2", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", "psr/cache": "^2.0||^3.0", @@ -1398,9 +1629,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" + "source": "https://github.com/firebase/php-jwt/tree/v7.0.5" }, - "time": "2025-04-09T20:32:01+00:00" + "time": "2026-04-01T20:38:03+00:00" }, { "name": "fylax/forceutf8", @@ -1668,16 +1899,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -1693,6 +1924,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { @@ -1764,7 +1996,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -1780,7 +2012,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "intervention/image", @@ -2045,33 +2277,32 @@ }, { "name": "lychee-org/php-exif", - "version": "v1.0.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/LycheeOrg/php-exif.git", - "reference": "12c4976d2dea44fc4eb3b9dd33428b95ba7461c0" + "reference": "4e4fad2f2617c94e35df26a099d9b04a49cdc4b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LycheeOrg/php-exif/zipball/12c4976d2dea44fc4eb3b9dd33428b95ba7461c0", - "reference": "12c4976d2dea44fc4eb3b9dd33428b95ba7461c0", + "url": "https://api.github.com/repos/LycheeOrg/php-exif/zipball/4e4fad2f2617c94e35df26a099d9b04a49cdc4b4", + "reference": "4e4fad2f2617c94e35df26a099d9b04a49cdc4b4", "shasum": "" }, "require": { "ext-fileinfo": "*", - "fylax/forceutf8": "^3.0.1", - "php": "^8.1", - "php-ffmpeg/php-ffmpeg": "^1.0", - "thecodingmachine/safe": "^2.2" + "fylax/forceutf8": "^3.0.3", + "php": "^8.2 || ^8.3 || ^8.4 || ^8.5", + "php-ffmpeg/php-ffmpeg": "^1.4", + "thecodingmachine/safe": "^2.0 || ^3.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.3", - "infection/infection": "^0.26.13", - "lychee-org/phpstan-lychee": "^1.0.1", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpmd/phpmd": "^2.9", + "friendsofphp/php-cs-fixer": "^3.51", + "lychee-org/phpstan-lychee": "^2.0.1|^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpmd/phpmd": "^2.15", "phpunit/phpunit": "^9.5.10", - "squizlabs/php_codesniffer": "^3.5", + "squizlabs/php_codesniffer": "^3.9", "thecodingmachine/phpstan-safe-rule": "^1.2" }, "suggest": { @@ -2092,10 +2323,15 @@ "MIT" ], "authors": [ + { + "name": "LycheeOrg", + "homepage": "https://lycheeorg.dev/", + "role": "Maintainers" + }, { "name": "Tom Van Herreweghe", "homepage": "http://theanalogguy.be", - "role": "Developer" + "role": "Creator" } ], "description": "Object-Oriented EXIF parsing", @@ -2112,45 +2348,45 @@ ], "support": { "issues": "https://github.com/LycheeOrg/php-exif/issues", - "source": "https://github.com/LycheeOrg/php-exif/tree/v1.0.2" + "source": "https://github.com/LycheeOrg/php-exif/tree/1.3.0" }, - "time": "2023-04-11T11:03:27+00:00" + "time": "2026-01-31T14:00:30+00:00" }, { "name": "matthiasmullie/scrapbook", - "version": "1.4.9", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/matthiasmullie/scrapbook.git", - "reference": "da4178c1882136a8931ffd791df2b84a5aa74219" + "reference": "6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matthiasmullie/scrapbook/zipball/da4178c1882136a8931ffd791df2b84a5aa74219", - "reference": "da4178c1882136a8931ffd791df2b84a5aa74219", + "url": "https://api.github.com/repos/matthiasmullie/scrapbook/zipball/6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1", + "reference": "6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1", "shasum": "" }, "require": { - "php": ">=5.3.0", - "psr/cache": "^1.0||~2.0", - "psr/simple-cache": "^1.0||~2.0" + "php": ">=8.0.0", + "psr/cache": "^2.0||^3.0", + "psr/simple-cache": "^2.0||^3.0" }, "provide": { - "psr/cache-implementation": "^1.0||~2.0", - "psr/simple-cache-implementation": "^1.0||~2.0" + "psr/cache-implementation": "^1.0||^2.0||^3.0", + "psr/simple-cache-implementation": "^1.0||^2.0||^3.0" }, "require-dev": { "ext-pcntl": "*", - "friendsofphp/php-cs-fixer": ">=2.0", - "phpunit/phpunit": ">=4.8" + "friendsofphp/php-cs-fixer": ">=3.0", + "phpunit/phpunit": ">=10.0" }, "suggest": { - "couchbase/couchbase": ">=2.0", - "ext-apc": ">=3.1.1", - "ext-couchbase": ">=2.0.0", + "couchbase/couchbase": ">=3.0", + "ext-apcu": ">=4.0.0", + "ext-couchbase": ">=3.0.0", "ext-memcached": ">=2.0.0", "ext-pdo": ">=0.1.0", - "ext-redis": ">=2.2.0 || 0.0.0.0", + "ext-redis": ">=2.2.0||0.0.0.0", "league/flysystem": ">=1.0" }, "type": "library", @@ -2171,7 +2407,7 @@ "role": "Developer" } ], - "description": "Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APC(u), SQL and additional capabilities (e.g. transactions, stampede protection) built on top.", + "description": "Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APCu, SQL and additional capabilities (e.g. transactions, stampede protection) built on top.", "homepage": "https://scrapbook.cash", "keywords": [ "Buffer", @@ -2205,7 +2441,7 @@ ], "support": { "issues": "https://github.com/matthiasmullie/scrapbook/issues", - "source": "https://github.com/matthiasmullie/scrapbook/tree/1.4.9" + "source": "https://github.com/matthiasmullie/scrapbook/tree/1.5.4" }, "funding": [ { @@ -2213,7 +2449,7 @@ "type": "github" } ], - "time": "2022-11-10T09:28:49+00:00" + "time": "2024-12-20T11:47:12+00:00" }, { "name": "mlocati/ip-lib", @@ -2761,25 +2997,25 @@ }, { "name": "php-ffmpeg/php-ffmpeg", - "version": "v1.3.2", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/PHP-FFMpeg/PHP-FFMpeg.git", - "reference": "8e74bdc07ad200da7a6cfb21ec2652875e4368e0" + "reference": "41fa00949ea2758cd34f076a8030df7198d57759" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/8e74bdc07ad200da7a6cfb21ec2652875e4368e0", - "reference": "8e74bdc07ad200da7a6cfb21ec2652875e4368e0", + "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/41fa00949ea2758cd34f076a8030df7198d57759", + "reference": "41fa00949ea2758cd34f076a8030df7198d57759", "shasum": "" }, "require": { "evenement/evenement": "^3.0", - "php": "^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4", + "php": "^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4 || ^8.5", "psr/log": "^1.0 || ^2.0 || ^3.0", "spatie/temporary-directory": "^2.0", - "symfony/cache": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0" + "symfony/cache": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { "mockery/mockery": "^1.5", @@ -2844,90 +3080,9 @@ ], "support": { "issues": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues", - "source": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.3.2" + "source": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.4.0" }, - "time": "2025-04-01T20:36:46+00:00" - }, - { - "name": "phpmailer/phpmailer", - "version": "v6.12.0", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/annotations": "^1.2.6 || ^1.13.3", - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.7.2", - "yoast/phpunit-polyfills": "^1.0.4" - }, - "suggest": { - "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "ext-openssl": "Needed for secure SMTP sending and DKIM signing", - "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", - "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "support": { - "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0" - }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2025-10-15T16:49:08+00:00" + "time": "2026-01-19T21:15:14+00:00" }, { "name": "phpseclib/bcmath_compat", @@ -2993,16 +3148,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.48", + "version": "3.0.50", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "64065a5679c50acb886e82c07aa139b0f757bb89" + "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/64065a5679c50acb886e82c07aa139b0f757bb89", - "reference": "64065a5679c50acb886e82c07aa139b0f757bb89", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", + "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", "shasum": "" }, "require": { @@ -3083,7 +3238,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.48" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.50" }, "funding": [ { @@ -3099,7 +3254,7 @@ "type": "tidelift" } ], - "time": "2025-12-15T11:51:42+00:00" + "time": "2026-03-19T02:57:58+00:00" }, { "name": "pragmarx/google2fa", @@ -3222,20 +3377,20 @@ }, { "name": "psr/cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -3255,7 +3410,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -3265,9 +3420,57 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" }, { "name": "psr/container", @@ -3322,6 +3525,56 @@ }, "time": "2021-11-05T16:47:00+00:00" }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, { "name": "psr/http-client", "version": "1.0.3", @@ -3647,16 +3900,16 @@ }, { "name": "psr/simple-cache", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a" + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a", - "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { @@ -3665,7 +3918,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -3692,22 +3945,22 @@ "simple-cache" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/2.0.0" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "time": "2021-10-29T13:22:09+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { "name": "psy/psysh", - "version": "v0.11.22", + "version": "v0.11.23", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" + "reference": "e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", - "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf", + "reference": "e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf", "shasum": "" }, "require": { @@ -3772,9 +4025,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.23" }, - "time": "2023-10-14T21:56:36+00:00" + "time": "2026-01-30T05:01:10+00:00" }, { "name": "ralouphie/getallheaders", @@ -3883,16 +4136,16 @@ }, { "name": "spatie/temporary-directory", - "version": "2.3.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/spatie/temporary-directory.git", - "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b" + "reference": "662e481d6ec07ef29fd05010433428851a42cd07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/580eddfe9a0a41a902cac6eeb8f066b42e65a32b", - "reference": "580eddfe9a0a41a902cac6eeb8f066b42e65a32b", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/662e481d6ec07ef29fd05010433428851a42cd07", + "reference": "662e481d6ec07ef29fd05010433428851a42cd07", "shasum": "" }, "require": { @@ -3928,7 +4181,7 @@ ], "support": { "issues": "https://github.com/spatie/temporary-directory/issues", - "source": "https://github.com/spatie/temporary-directory/tree/2.3.0" + "source": "https://github.com/spatie/temporary-directory/tree/2.3.1" }, "funding": [ { @@ -3940,62 +4193,348 @@ "type": "github" } ], - "time": "2025-01-13T13:04:43+00:00" + "time": "2026-01-12T07:42:22+00:00" }, { - "name": "symfony/cache", - "version": "v5.4.46", + "name": "symfony/aha-send-mailer", + "version": "v7.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b" + "url": "https://github.com/symfony/aha-send-mailer.git", + "reference": "dd146909b3e32663a874b8c7c2fcc86145b04ee9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/0fe08ee32cec2748fbfea10c52d3ee02049e0f6b", - "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b", + "url": "https://api.github.com/repos/symfony/aha-send-mailer/zipball/dd146909b3e32663a874b8c7c2fcc86145b04ee9", + "reference": "dd146909b3e32663a874b8c7c2fcc86145b04ee9", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "symfony/mailer": "^7.3|^8.0" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\AhaSend\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Farhad Hedayatifard", + "email": "farhad@ahasend.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony AhaSend Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/aha-send-mailer/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-08T08:25:11+00:00" + }, + { + "name": "symfony/amazon-mailer", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/amazon-mailer.git", + "reference": "6fedfa970a1b5b2c93fd32c598df7db7d03070b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/amazon-mailer/zipball/6fedfa970a1b5b2c93fd32c598df7db7d03070b4", + "reference": "6fedfa970a1b5b2c93fd32c598df7db7d03070b4", + "shasum": "" + }, + "require": { + "async-aws/ses": "^1.8", + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Amazon\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Amazon Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/amazon-mailer/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-11T15:05:50+00:00" + }, + { + "name": "symfony/azure-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/azure-mailer.git", + "reference": "c9a3e6ce0ca35798a9fc8ae62dd7d00fa9d9399b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/azure-mailer/zipball/c9a3e6ce0ca35798a9fc8ae62dd7d00fa9d9399b", + "reference": "c9a3e6ce0ca35798a9fc8ae62dd7d00fa9d9399b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Azure\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rafael Villa Verde", + "homepage": "https://github.com/hafael" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Microsoft Azure Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/azure-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, + { + "name": "symfony/brevo-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/brevo-mailer.git", + "reference": "f1ef26ffe147e9185531030fc1503ed7b63fa0ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/brevo-mailer/zipball/f1ef26ffe147e9185531030fc1503ed7b63fa0ef", + "reference": "f1ef26ffe147e9185531030fc1503ed7b63fa0ef", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" }, "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" + "symfony/mime": "<6.2" + }, + "require-dev": { + "symfony/http-client": "^6.3|^7.0|^8.0", + "symfony/webhook": "^6.3|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Brevo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pierre Tanguy", + "homepage": "https://github.com/petanguy" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Brevo Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/brevo-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T08:00:56+00:00" + }, + { + "name": "symfony/cache", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "467464da294734b0fb17e853e5712abc8470f819" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/467464da294734b0fb17e853e5712abc8470f819", + "reference": "467464da294734b0fb17e853e5712abc8470f819", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^3.6", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "ext-redis": "<6.1", + "ext-relay": "<0.12.1", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" }, "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0|2.0", - "symfony/cache-implementation": "1.0|2.0" + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "psr/simple-cache": "^1.0|^2.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, + "classmap": [ + "Traits/ValueWrapper.php" + ], "exclude-from-classmap": [ "/Tests/" ] @@ -4021,7 +4560,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.46" + "source": "https://github.com/symfony/cache/tree/v7.4.8" }, "funding": [ { @@ -4032,33 +4571,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-04T11:43:55+00:00" + "time": "2026-03-30T15:15:47+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.4", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e" + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e", - "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0" - }, - "suggest": { - "symfony/cache-implementation": "" + "php": ">=8.1", + "psr/cache": "^3.0" }, "type": "library", "extra": { @@ -4067,7 +4607,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -4100,7 +4640,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4" + "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" }, "funding": [ { @@ -4116,20 +4656,98 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2025-03-13T15:25:07+00:00" }, { - "name": "symfony/console", - "version": "v6.4.31", + "name": "symfony/clock", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997" + "url": "https://github.com/symfony/clock.git", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f9f8a889f54c264f9abac3fc0f7a371ffca51997", - "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997", + "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", "shasum": "" }, "require": { @@ -4194,7 +4812,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.31" + "source": "https://github.com/symfony/console/tree/v6.4.36" }, "funding": [ { @@ -4214,7 +4832,7 @@ "type": "tidelift" } ], - "time": "2025-12-22T08:30:34+00:00" + "time": "2026-03-27T15:30:51+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4284,26 +4902,187 @@ "time": "2024-09-25T14:21:43+00:00" }, { - "name": "symfony/filesystem", - "version": "v6.4.30", + "name": "symfony/event-dispatcher", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "f57b899fa736fd71121168ef268f23c206083f0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f57b899fa736fd71121168ef268f23c206083f0a", + "reference": "f57b899fa736fd71121168ef268f23c206083f0a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T13:54:39+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "58b9790d12f9670b7f53a1c1738febd3108970a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/58b9790d12f9670b7f53a1c1738febd3108970a5", + "reference": "58b9790d12f9670b7f53a1c1738febd3108970a5", + "shasum": "" + }, + "require": { + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4331,7 +5110,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/filesystem/tree/v7.4.8" }, "funding": [ { @@ -4351,7 +5130,1027 @@ "type": "tidelift" } ], - "time": "2025-11-26T14:43:45+00:00" + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/http-client", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "01933e626c3de76bea1e22641e205e78f6a34342" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/01933e626c3de76bea1e22641e205e78f6a34342", + "reference": "01933e626c3de76bea1e22641e205e78f6a34342", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T12:55:43+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-29T11:18:49+00:00" + }, + { + "name": "symfony/infobip-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/infobip-mailer.git", + "reference": "eb1253a830f35bb642a52084bbe87cfbde95261f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/infobip-mailer/zipball/eb1253a830f35bb642a52084bbe87cfbde95261f", + "reference": "eb1253a830f35bb642a52084bbe87cfbde95261f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0" + }, + "conflict": { + "symfony/mime": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Infobip\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jean-Baptiste Delhommeau", + "email": "jeanbadel@gmail.com" + }, + { + "name": "Benoit Galati", + "email": "benoit.galati@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Infobip Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/infobip-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-09T22:28:14+00:00" + }, + { + "name": "symfony/mail-pace-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mail-pace-mailer.git", + "reference": "f37364729794808f644ec03fc84335dce9fd3573" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mail-pace-mailer/zipball/f37364729794808f644ec03fc84335dce9fd3573", + "reference": "f37364729794808f644ec03fc84335dce9fd3573", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "symfony/mailer": "^7.2|^8.0" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\MailPace\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Paul Oms", + "homepage": "https://mailpace.com" + } + ], + "description": "Symfony MailPace Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mail-pace-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, + { + "name": "symfony/mailchimp-mailer", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailchimp-mailer.git", + "reference": "d3d861e9ceeeadcd7b9874f41bd217e9537517a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailchimp-mailer/zipball/d3d861e9ceeeadcd7b9874f41bd217e9537517a6", + "reference": "d3d861e9ceeeadcd7b9874f41bd217e9537517a6", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/webhook": "<7.2" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^7.2|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailchimp\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailchimp Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailchimp-mailer/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-23T13:47:45+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62", + "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/mailer-send-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer-send-mailer.git", + "reference": "579a3a41316e4adf69a3e140b840d68f478f95cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer-send-mailer/zipball/579a3a41316e4adf69a3e140b840d68f478f95cc", + "reference": "579a3a41316e4adf69a3e140b840d68f478f95cc", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.3|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\MailerSend\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ramunas Pabreza", + "email": "doobas@gmail.com" + }, + { + "name": "Tautvydas Tijunaitis", + "email": "fosron@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MailerSend Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer-send-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, + { + "name": "symfony/mailgun-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailgun-mailer.git", + "reference": "ffbcdbf93ed0700f083a6307acfb8f78dd3f091b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/ffbcdbf93ed0700f083a6307acfb8f78dd3f091b", + "reference": "ffbcdbf93ed0700f083a6307acfb8f78dd3f091b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailgun\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailgun Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailgun-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, + { + "name": "symfony/mailjet-mailer", + "version": "v7.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailjet-mailer.git", + "reference": "e41b20b2bcb3bfc263395afc47b9df5911ceaa8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailjet-mailer/zipball/e41b20b2bcb3bfc263395afc47b9df5911ceaa8f", + "reference": "e41b20b2bcb3bfc263395afc47b9df5911ceaa8f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.3|^8.0" + }, + "conflict": { + "symfony/mime": "<6.2" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailjet\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailjet Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailjet-mailer/tree/v7.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-04T13:54:41+00:00" + }, + { + "name": "symfony/mailomat-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailomat-mailer.git", + "reference": "bcadc6483b45c470a7e2c8c957162cb3a83f4300" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailomat-mailer/zipball/bcadc6483b45c470a7e2c8c957162cb3a83f4300", + "reference": "bcadc6483b45c470a7e2c8c957162cb3a83f4300", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/http-foundation": "<7.1" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.1|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailomat\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Landolt", + "email": "patrick.landolt@artack.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailomat Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailomat-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, + { + "name": "symfony/mailtrap-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailtrap-mailer.git", + "reference": "40f93b3bf73f5dd486ba31d2e825780d68ad4303" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailtrap-mailer/zipball/40f93b3bf73f5dd486ba31d2e825780d68ad4303", + "reference": "40f93b3bf73f5dd486ba31d2e825780d68ad4303", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/webhook": "<7.2" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^7.2|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailtrap\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailtrap Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailtrap-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-22T08:09:19+00:00" + }, + { + "name": "symfony/microsoft-graph-mailer", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/microsoft-graph-mailer.git", + "reference": "e9dc42d3c9fb0a3349a4947d51bdbe5b6638aa5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/microsoft-graph-mailer/zipball/e9dc42d3c9fb0a3349a4947d51bdbe5b6638aa5c", + "reference": "e9dc42d3c9fb0a3349a4947d51bdbe5b6638aa5c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/clock": "^7.4|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/mailer": "^7.4|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\MicrosoftGraph\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bob van de Vijver", + "homepage": "https://github.com/bobvandevijver" + }, + { + "name": "Kevin Nguyen", + "homepage": "https://github.com/nguyenk" + }, + { + "name": "The Coding Machine", + "homepage": "https://github.com/thecodingmachine" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Microsoft Graph Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/microsoft-graph-mailer/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-09T12:07:29+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379", + "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T14:11:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4518,6 +6317,93 @@ ], "time": "2025-06-27T09:58:17+00:00" }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.33.0", @@ -4689,17 +6575,17 @@ "time": "2024-12-23T08:48:59+00:00" }, { - "name": "symfony/polyfill-php73", + "name": "symfony/polyfill-php83", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -4717,7 +6603,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" @@ -4737,7 +6623,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4746,7 +6632,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -4766,41 +6652,36 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "name": "symfony/postal-mailer", + "version": "v7.4.6", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "url": "https://github.com/symfony/postal-mailer.git", + "reference": "a2f2d915861fac611323c1f256d9b841dce44c92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/postal-mailer/zipball/a2f2d915861fac611323c1f256d9b841dce44c92", + "reference": "a2f2d915861fac611323c1f256d9b841dce44c92", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0" }, + "type": "symfony-mailer-bridge", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Component\\Mailer\\Bridge\\Postal\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4809,28 +6690,18 @@ ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Jonas Claes", + "homepage": "https://github.com/jonasclaes" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony Postal Mailer Bridge", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/postal-mailer/tree/v7.4.6" }, "funding": [ { @@ -4850,24 +6721,98 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-02-23T11:56:35+00:00" + }, + { + "name": "symfony/postmark-mailer", + "version": "v7.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/postmark-mailer.git", + "reference": "8b573474e89368f1ddb25b43fd86a6dd51343e9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/8b573474e89368f1ddb25b43fd86a6dd51343e9b", + "reference": "8b573474e89368f1ddb25b43fd86a6dd51343e9b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Postmark\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Postmark Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/postmark-mailer/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-08T08:25:11+00:00" }, { "name": "symfony/process", - "version": "v6.4.31", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8541b7308fca001320e90bca8a73a28aa5604a6e" + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8541b7308fca001320e90bca8a73a28aa5604a6e", - "reference": "8541b7308fca001320e90bca8a73a28aa5604a6e", + "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -4895,7 +6840,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.31" + "source": "https://github.com/symfony/process/tree/v7.4.8" }, "funding": [ { @@ -4915,7 +6860,225 @@ "type": "tidelift" } ], - "time": "2025-12-15T19:26:35+00:00" + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/resend-mailer", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/resend-mailer.git", + "reference": "eb7f4d83128eef12fcceccf33e5b4b89f2e2474f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/resend-mailer/zipball/eb7f4d83128eef12fcceccf33e5b4b89f2e2474f", + "reference": "eb7f4d83128eef12fcceccf33e5b4b89f2e2474f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/http-foundation": "<7.1" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.1|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Resend\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathieu Santostefano", + "homepage": "https://github.com/welcoMattic" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Resend Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/resend-mailer/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-09T14:10:20+00:00" + }, + { + "name": "symfony/scaleway-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/scaleway-mailer.git", + "reference": "bf9b8f6133d74b620b7c2e90b6fa4bd1469832e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/scaleway-mailer/zipball/bf9b8f6133d74b620b7c2e90b6fa4bd1469832e9", + "reference": "bf9b8f6133d74b620b7c2e90b6fa4bd1469832e9", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Scaleway\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Scaleway Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/scaleway-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, + { + "name": "symfony/sendgrid-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/sendgrid-mailer.git", + "reference": "48e81fdbeb443a8094b7d5322d4c1a2023c40a57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/sendgrid-mailer/zipball/48e81fdbeb443a8094b7d5322d4c1a2023c40a57", + "reference": "48e81fdbeb443a8094b7d5322d4c1a2023c40a57", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/http-foundation": "<6.4", + "symfony/mime": "<6.4", + "symfony/webhook": "<7.2" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^7.2|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Sendgrid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Sendgrid Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/sendgrid-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-16T14:23:56+00:00" }, { "name": "symfony/service-contracts", @@ -5006,22 +7169,23 @@ }, { "name": "symfony/string", - "version": "v6.4.30", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "reference": "114ac57257d75df748eda23dd003878080b8e688" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688", + "reference": "114ac57257d75df748eda23dd003878080b8e688", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.33", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, @@ -5029,10 +7193,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5071,7 +7236,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "source": "https://github.com/symfony/string/tree/v7.4.8" }, "funding": [ { @@ -5091,20 +7256,94 @@ "type": "tidelift" } ], - "time": "2025-11-21T18:03:05+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { - "name": "symfony/var-dumper", - "version": "v6.4.26", + "name": "symfony/sweego-mailer", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a" + "url": "https://github.com/symfony/sweego-mailer.git", + "reference": "8ab5f920ce2bb60757ab633cda9c0bac39f502a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfae1497a2f1eaad78dbc0590311c599c7178d4a", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a", + "url": "https://api.github.com/repos/symfony/sweego-mailer/zipball/8ab5f920ce2bb60757ab633cda9c0bac39f502a8", + "reference": "8ab5f920ce2bb60757ab633cda9c0bac39f502a8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/http-foundation": "<7.1" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.1|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Sweego\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathieu Santostefano", + "homepage": "https://github.com/welcoMattic" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Sweego Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/sweego-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-21T15:26:00+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.36", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7c8ad9ce4faf6c8a99948e70ce02b601a0439782", + "reference": "7c8ad9ce4faf6c8a99948e70ce02b601a0439782", "shasum": "" }, "require": { @@ -5159,7 +7398,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.26" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.36" }, "funding": [ { @@ -5179,30 +7418,30 @@ "type": "tidelift" } ], - "time": "2025-09-25T15:37:27+00:00" + "time": "2026-03-30T15:36:00+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.26", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" + "reference": "398907e89a2a56fe426f7955c6fa943ec0c77225" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/398907e89a2a56fe426f7955c6fa943ec0c77225", + "reference": "398907e89a2a56fe426f7955c6fa943ec0c77225", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5240,7 +7479,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.8" }, "funding": [ { @@ -5260,50 +7499,35 @@ "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "thecodingmachine/safe", - "version": "v2.5.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.1" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10", + "squizlabs/php_codesniffer": "^3.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, "autoload": { "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", "lib/special_cases.php", - "deprecated/mysqli.php", "generated/apache.php", "generated/apcu.php", "generated/array.php", @@ -5343,6 +7567,7 @@ "generated/mbstring.php", "generated/misc.php", "generated/mysql.php", + "generated/mysqli.php", "generated/network.php", "generated/oci8.php", "generated/opcache.php", @@ -5355,6 +7580,7 @@ "generated/ps.php", "generated/pspell.php", "generated/readline.php", + "generated/rnp.php", "generated/rpminfo.php", "generated/rrd.php", "generated/sem.php", @@ -5386,7 +7612,6 @@ "lib/DateTime.php", "lib/DateTimeImmutable.php", "lib/Exceptions/", - "deprecated/Exceptions/", "generated/Exceptions/" ] }, @@ -5397,76 +7622,27 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0" }, - "time": "2023-04-05T11:54:14+00:00" - }, - { - "name": "xrdebug/php", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/xrdebug/php.git", - "reference": "9df68ba66668b0072abb91859d27407d6772f0fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/xrdebug/php/zipball/9df68ba66668b0072abb91859d27407d6772f0fd", - "reference": "9df68ba66668b0072abb91859d27407d6772f0fd", - "shasum": "" - }, - "require": { - "chevere/filesystem": "^1.0.3", - "chevere/message": "^1.0.0", - "chevere/standard": "^1.0.1", - "chevere/throwable-handler": "^1.0.7", - "chevere/trace": "^2.0.2", - "chevere/var-dump": "^2.0.6", - "ext-curl": "*", - "ext-json": "*", - "php": "^8.1", - "phpseclib/phpseclib": "~3.0" - }, - "require-dev": { - "dg/bypass-finals": "^1.4", - "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^9.5", - "symplify/easy-coding-standard": "^11.1" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Chevere\\xrDebug\\PHP\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ + "funding": [ { - "name": "Rodolfo Berrios", - "email": "rodolfo@chevere.org", - "homepage": "https://rodolfoberrios.com" + "url": "https://github.com/OskarStark", + "type": "github" + }, + { + "url": "https://github.com/shish", + "type": "github" + }, + { + "url": "https://github.com/silasjoisten", + "type": "github" + }, + { + "url": "https://github.com/staabm", + "type": "github" } ], - "description": "PHP client library for xrDebug", - "homepage": "https://github.com/xrdebug/php", - "keywords": [ - "chevere", - "debug", - "debugging", - "dump", - "xrdebug" - ], - "support": { - "issues": "https://github.com/xrdebug/php/issues", - "source": "https://github.com/xrdebug/php/tree/3.0.1" - }, - "time": "2025-09-12T21:27:45+00:00" + "time": "2026-02-04T18:08:13+00:00" } ], "packages-dev": [ @@ -5720,11 +7896,11 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.32", + "version": "1.12.33", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8", - "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/37982d6fc7cbb746dda7773530cda557cdf119e1", + "reference": "37982d6fc7cbb746dda7773530cda557cdf119e1", "shasum": "" }, "require": { @@ -5769,7 +7945,7 @@ "type": "github" } ], - "time": "2025-09-30T10:16:31+00:00" + "time": "2026-02-28T20:30:03+00:00" }, { "name": "phpunit/php-code-coverage", @@ -6092,16 +8268,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.31", + "version": "9.6.34", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "945d0b7f346a084ce5549e95289962972c4272e5" + "reference": "b36f02317466907a230d3aa1d34467041271ef4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5", - "reference": "945d0b7f346a084ce5549e95289962972c4272e5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b36f02317466907a230d3aa1d34467041271ef4a", + "reference": "b36f02317466907a230d3aa1d34467041271ef4a", "shasum": "" }, "require": { @@ -6123,7 +8299,7 @@ "phpunit/php-timer": "^5.0.3", "sebastian/cli-parser": "^1.0.2", "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.9", + "sebastian/comparator": "^4.0.10", "sebastian/diff": "^4.0.6", "sebastian/environment": "^5.1.5", "sebastian/exporter": "^4.0.8", @@ -6175,7 +8351,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.31" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.34" }, "funding": [ { @@ -6199,7 +8375,7 @@ "type": "tidelift" } ], - "time": "2025-12-06T07:45:52+00:00" + "time": "2026-01-27T05:45:00+00:00" }, { "name": "sebastian/cli-parser", @@ -6370,16 +8546,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.9", + "version": "4.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d", + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d", "shasum": "" }, "require": { @@ -6432,7 +8608,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10" }, "funding": [ { @@ -6452,7 +8628,7 @@ "type": "tidelift" } ], - "time": "2025-08-10T06:51:50+00:00" + "time": "2026-01-24T09:22:56+00:00" }, { "name": "sebastian/complexity", @@ -7330,11 +9506,11 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.1" + "php": "^8.2" }, "platform-dev": {}, "platform-overrides": { - "php": "8.1.28" + "php": "8.2" }, "plugin-api-version": "2.9.0" } diff --git a/app/env-default.php b/app/env-default.php index 177e459..6ab9c9a 100644 --- a/app/env-default.php +++ b/app/env-default.php @@ -90,7 +90,6 @@ return [ 'CHEVERETO_HTTPS' => '1', 'CHEVERETO_IMAGE_FORMATS_AVAILABLE' => '["AVIF","JPEG","PNG","BMP","GIF","WEBP"]', 'CHEVERETO_IMAGE_LIBRARY' => 'imagick', - 'CHEVERETO_JOBS_WORKER_INTERVAL' => '300', 'CHEVERETO_MAX_ADMINS' => '0', 'CHEVERETO_MAX_ALBUMS' => '0', 'CHEVERETO_MAX_CACHE_TTL' => '86400', @@ -115,6 +114,8 @@ return [ 'CHEVERETO_MIN_STORAGES_ACTIVE' => '0', 'CHEVERETO_PROVIDER_NAME' => 'Self-hosted Chevereto', 'CHEVERETO_PROVIDER_URL' => '', + 'CHEVERETO_SCHEDULER_INTERVAL' => '300', + 'CHEVERETO_SERVICE_NAME' => 'app', 'CHEVERETO_SERVICING' => 'server', 'CHEVERETO_SESSION_SAVE_HANDLER' => 'files', 'CHEVERETO_SESSION_SAVE_PATH' => '/tmp', @@ -123,6 +124,7 @@ return [ 'CHEVERETO_TENANTS_API_ALLOW_LIST' => '', 'CHEVERETO_TENANTS_API_KEY_SECRET' => '', 'CHEVERETO_TENANTS_API_REQUEST_SECRET' => '', + 'CHEVERETO_TRIAL' => '0', 'CHEVERETO_XRDEBUG_HOST' => 'localhost', 'CHEVERETO_XRDEBUG_HTTPS' => '0', 'CHEVERETO_XRDEBUG_KEY' => '', diff --git a/app/legacy/commands/password-reset.php b/app/legacy/commands/password-reset.php index 5bf31d2..b8a921d 100644 --- a/app/legacy/commands/password-reset.php +++ b/app/legacy/commands/password-reset.php @@ -10,16 +10,22 @@ */ use Chevereto\Legacy\Classes\Login; +use Chevereto\Legacy\Classes\Settings; use Chevereto\Legacy\Classes\User; use function Chevere\Standard\randomString; -$opts = getopt('C:u:') ?: []; +$opts = getopt('C:u:x:') ?: []; $missing = []; if (! isset($opts['u'])) { echo '[Error] Missing username' . "\n"; exit(255); } -$password = randomString(24); +$password = $opts['x'] ?? randomString(24); +if (! preg_match('/' . Settings::USER_PASSWORD_PATTERN . '/', $password)) { + echo '[Error] Invalid password' . "\n"; + exit(255); +} + $user = User::getSingle($opts['u'], 'username'); if ($user === []) { echo '[Error] User not found' . "\n"; diff --git a/app/src/Legacy/Classes/Mailer.php b/app/legacy/commands/version-installed.php similarity index 52% rename from app/src/Legacy/Classes/Mailer.php rename to app/legacy/commands/version-installed.php index b204c0a..bbce376 100644 --- a/app/src/Legacy/Classes/Mailer.php +++ b/app/legacy/commands/version-installed.php @@ -9,11 +9,11 @@ * file that was distributed with this source code. */ -namespace Chevereto\Legacy\Classes; +use function Chevereto\Legacy\cheveretoVersionInstalled; -use PHPMailer\PHPMailer\PHPMailer; - -class Mailer extends PHPMailer -{ - public $XMailer = ' '; +$version = cheveretoVersionInstalled(); +if ($version === '') { + echo 'Chevereto is not installed' . PHP_EOL; + exit(255); } +echo $version . PHP_EOL; diff --git a/app/legacy/entrypoints/cli.php b/app/legacy/entrypoints/cli.php index dd45242..616421e 100644 --- a/app/legacy/entrypoints/cli.php +++ b/app/legacy/entrypoints/cli.php @@ -41,6 +41,7 @@ $options = [ 'setting-update', 'database-migrate', 'version', + 'version-installed', 'stats', 'stats-rebuild', ]; diff --git a/app/legacy/install/installer.php b/app/legacy/install/installer.php index cc67b14..ec9d1cb 100644 --- a/app/legacy/install/installer.php +++ b/app/legacy/install/installer.php @@ -59,6 +59,16 @@ if (cheveretoVersionInstalled() !== '' throw new LogicException(message('Request denied. You must be an admin to be here.'), 403); } +if ((env()['CHEVERETO_TENANT'] ?? '') !== '') { + if (env()['CHEVERETO_DB_TABLE_PREFIX'] === env()['CHEVERETO_DB_TABLE_ROOT_PREFIX'] + || env()['CHEVERETO_CACHE_KEY_PREFIX'] === env()['CHEVERETO_CACHE_KEY_ROOT_PREFIX'] + ) { + throw new LogicException( + 'Tenant namespace collision detected. Refusing install/update with root prefixes.', + 600 + ); + } +} if (function_exists('opcache_reset')) { try { opcache_reset(); @@ -121,7 +131,7 @@ $settings_updates = [ // 'google' => 0, // Deprecated in 4.0.0-beta.11 // 'google_client_id' => '', // 'google_client_secret' => '', - 'guest_uploads' => 1, + 'guest_uploads' => intval(env()['CHEVERETO_CONTEXT'] !== 'saas'), 'listing_items_per_page' => '24', 'maintenance' => 0, 'captcha' => 0, //recaptcha @@ -660,6 +670,36 @@ $settings_updates = [ '4.4.0' => null, '4.4.1' => null, '4.4.2' => null, + '4.5.0' => [ + 'email_ahasend_api_key' => '', + 'email_ses_access_key' => '', + 'email_ses_secret_key' => '', + 'email_azure_resource_name' => '', + 'email_azure_key' => '', + 'email_brevo_api_key' => '', + 'email_infobip_api_key' => '', + 'email_infobip_base_url' => '', + 'email_mailgun_api_key' => '', + 'email_mailgun_domain' => '', + 'email_mailjet_access_key' => '', + 'email_mailjet_secret_key' => '', + 'email_mailomat_api_key' => '', + 'email_mailpace_api_token' => '', + 'email_mailersend_api_key' => '', + 'email_mailtrap_api_token' => '', + 'email_mandrill_api_key' => '', + 'email_microsoftgraph_client_id' => '', + 'email_microsoftgraph_client_secret' => '', + 'email_microsoftgraph_tenant_id' => '', + 'email_postal_api_key' => '', + 'email_postal_base_url' => '', + 'email_postmark_api_token' => '', + 'email_resend_api_key' => '', + 'email_scaleway_project_id' => '', + 'email_scaleway_api_key' => '', + 'email_sendgrid_api_key' => '', + 'email_sweego_api_key' => '', + ], ]; /** diff --git a/app/legacy/load/app.php b/app/legacy/load/app.php index 8e5341a..a1deb22 100644 --- a/app/legacy/load/app.php +++ b/app/legacy/load/app.php @@ -9,5 +9,5 @@ * file that was distributed with this source code. */ -const APP_VERSION = '4.4.2'; -const APP_VERSION_AKA = 'vivaracho'; +const APP_VERSION = '4.5.0'; +const APP_VERSION_AKA = 'elevado'; diff --git a/app/legacy/load/register-handlers.php b/app/legacy/load/register-handlers.php index 638ef73..bb16d0f 100644 --- a/app/legacy/load/register-handlers.php +++ b/app/legacy/load/register-handlers.php @@ -93,21 +93,49 @@ set_exception_handler(function (Throwable $throwable) { $internalHandler = $publicHandler->withIsDebug(true); $doDebug = in_array($debugLevel, [2, 3], true) || isDebug(); if ($doDebug === false) { - $publicHandler = $publicHandler - ->withIsDebug($doDebug) - ->withPutExtra( - 'Why am I seeing this?', + $incidentId = $publicHandler->id(); + $providerName = getenv('CHEVERETO_PROVIDER_NAME') ?: ''; + $providerUrl = getenv('CHEVERETO_PROVIDER_URL') ?: '#'; + if (getenv('CHEVERETO_CONTEXT') === 'saas') { + $title = 'Service temporarily unavailable'; + $message = "We're already on it! Our team has been automatically notified and is working to resolve this issue."; + $ownerGuide = strtr( <<Our team is already investigating this incident. For immediate assistance, contact %providerLink% support with incident ID %id%.

+ HTML, + [ + '%providerLink%' => <<{$providerName} + HTML, + '%id%' => $incidentId, + ] + ); + } else { + $title = 'Something went wrong'; + $message = 'Please try again later. If the error persists you may need to contact the website owner.'; + $ownerGuide = <<This error has been logged with ID {$incidentId}. To diagnose the issue:

+
    +
  1. Check your server error logs for this ID
  2. +
  3. Review the debugging guide in the documentation
  4. +
  5. Need help? Check our support alternatives
  6. +
+ HTML; + } + $publicHandler = $publicHandler + ->withTitle($title) + ->withIsDebug($doDebug) + ->withMessage($message) + ->withPutExtra( + 'What happened?', + <<A technical error has occurred. The incident has been logged for investigation.

HTML ) ->withPutExtra( - 'Administrator guide', + 'Are you the owner of this website?', << -
  • Refer to the Chevereto documentation to understand how to debug this error.
  • -
  • Need help? Visit Chevereto support to open a ticket.
  • - + {$ownerGuide} HTML ); diff --git a/app/legacy/load/web.php b/app/legacy/load/web.php index ba6801c..ab735c0 100644 --- a/app/legacy/load/web.php +++ b/app/legacy/load/web.php @@ -10,9 +10,11 @@ */ use Chevere\Http\Exceptions\ControllerException; +use Chevere\Http\Exceptions\MethodNotAllowedException; use Chevere\Parameter\Interfaces\TypeInterface; use Chevere\Parameter\Type; use Chevere\Router\Container; +use Chevere\Router\Exceptions\NotFoundException; use Chevere\Writer\NullWriter; use Chevereto\Config\Config; use Chevereto\Legacy\Classes\Cache; @@ -125,11 +127,32 @@ if ($isTenantsApiRouting) { foreach ($headers as $name => $value) { $serverRequest = $serverRequest->withHeader($name, $value); } - $router = router(require dirname(__DIR__, 2) . '/routes/tenants-api-v4.php'); + $routerPath = dirname(__DIR__, 2) . '/routes/'; + $routes = [ + require $routerPath . 'tenants-api-v4.php', + ]; + if (in_array(server()['SERVER_NAME'], ['localhost', '127.0.0.1', '::1', 'app'])) { + $routes[] = require $routerPath . 'tenants-internal-api-v4.php'; + } + $router = router(...$routes); $container = $container->withAutoInject( $router->dependencies(), ); - $routed = $router->getRouted($serverRequest, $psr17Factory, container: $container); + + try { + $routed = $router->getRouted($serverRequest, $psr17Factory, container: $container); + } catch (NotFoundException|MethodNotAllowedException $e) { + http_response_code($e->getCode()); + header('Content-Type: application/json'); + echo json_encode([ + 'error' => [ + 'code' => $e->getCode(), + 'message' => $e->getMessage(), + 'list' => explode("\n", $e->getMessage()), + ], + ], JSON_PRETTY_PRINT); + exit(); + } if ($routed->hasThrowable() && ! ($routed->throwable() instanceof ControllerException) ) { diff --git a/app/legacy/routes/dashboard.php b/app/legacy/routes/dashboard.php index 1ca099f..9bab7b2 100644 --- a/app/legacy/routes/dashboard.php +++ b/app/legacy/routes/dashboard.php @@ -21,7 +21,6 @@ use Chevereto\Legacy\Classes\Image; use Chevereto\Legacy\Classes\L10n; use Chevereto\Legacy\Classes\Listing; use Chevereto\Legacy\Classes\Login; -use Chevereto\Legacy\Classes\Mailer; use Chevereto\Legacy\Classes\Page; use Chevereto\Legacy\Classes\ProjectArachnid; use Chevereto\Legacy\Classes\Settings; @@ -34,7 +33,8 @@ use Chevereto\Legacy\G\Handler; use FFMpeg\FFMpeg; use FFMpeg\FFProbe; use Intervention\Image\ImageManagerStatic; -use PHPMailer\PHPMailer\SMTP; +use Symfony\Component\Mailer\Transport; +use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport; use function Chevere\Standard\randomString; use function Chevereto\Encryption\hasEncryption; use function Chevereto\Legacy\badgePaid; @@ -73,9 +73,11 @@ use function Chevereto\Legacy\getSystemNotices; use function Chevereto\Legacy\getVariable; use function Chevereto\Legacy\headersNoCache; use function Chevereto\Legacy\strip_tags_content; +use function Chevereto\Legacy\trialAwareLabel; use function Chevereto\Legacy\updateCheveretoNews; use function Chevereto\Legacy\upload_to_content_images; use function Chevereto\Vars\env; +use function Chevereto\Vars\envTrialAware; use function Chevereto\Vars\files; use function Chevereto\Vars\get; use function Chevereto\Vars\post; @@ -916,13 +918,13 @@ return function (Handler $handler) { $settings_pages['title'] = _s('Add page'); $settings_pages['doing'] = 'add'; $pagesCount = Page::countAll(); - $maxPages = (int) env()['CHEVERETO_MAX_PAGES']; + $maxPages = (int) envTrialAware()['CHEVERETO_MAX_PAGES']; if ($maxPages !== 0) { if ($pagesCount >= $maxPages) { $is_error = true; $error_title = _s('Quota limit reached'); $error_message = _s( - 'Maximum number of pages allowed reached (limit %s).', + 'Maximum number of pages allowed reached (limit %s).' . trialAwareLabel(), $maxPages ); $handler::setVar('error_title', $error_title); @@ -1168,7 +1170,28 @@ return function (Handler $handler) { // 'page_file_path_absolute' => $POST['page_file_path_absolute'], ]); } - $mailApis = ['smtp']; + $mailApis = [ + 'smtp', + 'ahasend', + 'ses', + 'azure', + 'brevo', + 'infobip', + 'mailgun', + 'mailjet', + 'mailomat', + 'mailpace', + 'mailersend', + 'mailtrap', + 'mandrill', + 'microsoftgraph', + 'postal', + 'postmark', + 'resend', + 'scaleway', + 'sendgrid', + 'sweego', + ]; if (env()['CHEVERETO_SERVICING'] !== 'docker') { $mailApis[] = 'mail'; } @@ -1262,14 +1285,6 @@ return function (Handler $handler) { 'validate' => isset($POST['email_mode']) && in_array($POST['email_mode'], $mailApis, true), 'error_msg' => _s('Invalid email mode'), ], - 'email_smtp_server_port' => [ - 'validate' => isset($POST['email_smtp_server_port']) && $POST['email_smtp_server_port'] > 0 && $POST['email_smtp_server_port'] < 65536, - 'error_msg' => _s('Invalid SMTP port'), - ], - 'email_smtp_server_security' => [ - 'validate' => isset($POST['email_smtp_server_security']) && in_array($POST['email_smtp_server_security'], ['tls', 'ssl', 'unsecured'], true), - 'error_msg' => _s('Invalid SMTP security'), - ], 'website_mode' => [ 'validate' => isset($POST['website_mode']) && in_array($POST['website_mode'], ['community', 'personal'], true), 'error_msg' => _s('Invalid website mode'), @@ -1635,52 +1650,116 @@ return function (Handler $handler) { } } - if (isset($POST['email_mode']) && $POST['email_mode'] === 'smtp') { - $email_smtp_validate = [ - 'email_smtp_server' => _s('Invalid SMTP server'), - // 'email_smtp_server_username' => _s('Invalid SMTP username'), + $emailMode = $POST['email_mode'] ?? ''; + $emailApiRequiredFields = [ + 'smtp' => ['email_smtp_server', 'email_smtp_server_port', 'email_smtp_server_security'], + 'ahasend' => ['email_ahasend_api_key'], + 'ses' => ['email_ses_access_key', 'email_ses_secret_key'], + 'azure' => ['email_azure_resource_name', 'email_azure_key'], + 'brevo' => ['email_brevo_api_key'], + 'infobip' => ['email_infobip_api_key', 'email_infobip_base_url'], + 'mailersend' => ['email_mailersend_api_key'], + 'mailgun' => ['email_mailgun_api_key', 'email_mailgun_domain'], + 'mailjet' => ['email_mailjet_access_key', 'email_mailjet_secret_key'], + 'mailomat' => ['email_mailomat_api_key'], + 'mailpace' => ['email_mailpace_api_token'], + 'mailtrap' => ['email_mailtrap_api_token'], + 'mandrill' => ['email_mandrill_api_key'], + 'microsoftgraph' => ['email_microsoftgraph_client_id', 'email_microsoftgraph_client_secret', 'email_microsoftgraph_tenant_id'], + 'postal' => ['email_postal_api_key', 'email_postal_base_url'], + 'postmark' => ['email_postmark_api_token'], + 'resend' => ['email_resend_api_key'], + 'scaleway' => ['email_scaleway_project_id', 'email_scaleway_api_key'], + 'sendgrid' => ['email_sendgrid_api_key'], + 'sweego' => ['email_sweego_api_key'], + ]; + if ((env()['CHEVERETO_SERVICING'] !== 'server' && $emailMode === 'mail') + || (env()['CHEVERETO_CONTEXT'] === 'saas' && in_array($emailMode, ['smtp', 'mail'], true)) + ) { + $validations['email_mode'] = [ + 'validate' => false, + 'error_msg' => _s('The %s API is not available in this context', $emailMode), ]; - foreach ($email_smtp_validate as $k => $v) { - $validations[$k] = [ - 'validate' => (bool) $POST[$k], - 'error_msg' => $v, + } + if ($validations === [] && isset($emailApiRequiredFields[$emailMode])) { + foreach ($emailApiRequiredFields[$emailMode] as $field) { + $validations[$field] = [ + 'validate' => ! empty($POST[$field]), + 'error_msg' => _s('Invalid value'), ]; } - - $email_validate = [ - 'email_smtp_server', - 'email_smtp_server_port', - // 'email_smtp_server_username', - // 'email_smtp_server_password', - 'email_smtp_server_security', - ]; - $email_error = false; - foreach ($email_validate as $k) { - if (! $validations[$k]['validate']) { - $email_error = true; - } + $emailFieldsValid = array_reduce( + $emailApiRequiredFields[$emailMode], + fn (bool $carry, string $field) => $carry && ($validations[$field]['validate'] ?? false), + true + ); + if ($emailMode === 'smtp') { + $validations['email_smtp_server'] = [ + 'validate' => (bool) ($POST['email_smtp_server'] ?? ''), + 'error_msg' => _s('Invalid SMTP server'), + ]; + $validations['email_smtp_server_port'] = [ + 'validate' => isset($POST['email_smtp_server_port']) && $POST['email_smtp_server_port'] > 0 && $POST['email_smtp_server_port'] < 65536, + 'error_msg' => _s('Invalid SMTP port'), + ]; + $validations['email_smtp_server_security'] = [ + 'validate' => isset($POST['email_smtp_server_security']) && in_array($POST['email_smtp_server_security'], ['tls', 'ssl', 'unsecured'], true), + 'error_msg' => _s('Invalid SMTP security'), + ]; + $emailFieldsValid = $validations['email_smtp_server']['validate'] + && $validations['email_smtp_server_port']['validate'] + && $validations['email_smtp_server_security']['validate']; } - if (! $email_error) { + if ($emailFieldsValid) { try { - $mail = new Mailer(true); - $mail->Username = $POST['email_smtp_server_username'] ?? ''; - $mail->Password = $POST['email_smtp_server_password'] ?? ''; - $mail->SMTPAuth = $mail->Username !== '' || $mail->Password !== ''; - $mail->SMTPSecure = in_array($POST['email_smtp_server_security'], ['ssl', 'tls']) - ? $POST['email_smtp_server_security'] - : ''; - $mail->SMTPAutoTLS = in_array($POST['email_smtp_server_security'], ['ssl', 'tls']); - $mail->Host = (string) $POST['email_smtp_server']; - $mail->Port = (int) $POST['email_smtp_server_port']; - $mail->SMTPDebug = SMTP::DEBUG_SERVER; - $GLOBALS['SMTPDebug'] = ''; - $mail->Debugoutput = function ($str) { - $GLOBALS['SMTPDebug'] .= "{$str}\n"; + $dsn = match ($emailMode) { + 'smtp' => (function () use ($POST): string { + $username = urlencode($POST['email_smtp_server_username'] ?? ''); + $password = urlencode($POST['email_smtp_server_password'] ?? ''); + $host = (string) $POST['email_smtp_server']; + $port = (int) $POST['email_smtp_server_port']; + $security = $POST['email_smtp_server_security']; + $scheme = $security === 'ssl' ? 'smtps' : 'smtp'; + $auth = ($username !== '' || $password !== '') ? "{$username}:{$password}@" : ''; + $dsn = "{$scheme}://{$auth}{$host}:{$port}"; + if ($security === 'tls') { + $dsn .= '?encryption=tls'; + } elseif (! in_array($security, ['ssl', 'tls'], true)) { + $dsn .= '?verify_peer=false'; + } + + return $dsn; + })(), + 'ahasend' => 'ahasend+api://' . urlencode($POST['email_ahasend_api_key']) . '@default', + 'ses' => 'ses+api://' . urlencode($POST['email_ses_access_key']) . ':' . urlencode($POST['email_ses_secret_key']) . '@default', + 'azure' => 'azure+api://' . urlencode($POST['email_azure_resource_name']) . ':' . urlencode($POST['email_azure_key']) . '@default', + 'brevo' => 'brevo+api://' . urlencode($POST['email_brevo_api_key']) . '@default', + 'infobip' => 'infobip+api://' . urlencode($POST['email_infobip_api_key']) . '@' . urlencode($POST['email_infobip_base_url']), + 'mailersend' => 'mailersend+api://' . urlencode($POST['email_mailersend_api_key']) . '@default', + 'mailgun' => 'mailgun+api://' . urlencode($POST['email_mailgun_api_key']) . ':' . urlencode($POST['email_mailgun_domain']) . '@default', + 'mailjet' => 'mailjet+api://' . urlencode($POST['email_mailjet_access_key']) . ':' . urlencode($POST['email_mailjet_secret_key']) . '@default', + 'mailomat' => 'mailomat+api://' . urlencode($POST['email_mailomat_api_key']) . '@default', + 'mailpace' => 'mailpace+api://' . urlencode($POST['email_mailpace_api_token']) . '@default', + 'mailtrap' => 'mailtrap+api://' . urlencode($POST['email_mailtrap_api_token']) . '@default', + 'mandrill' => 'mandrill+api://' . urlencode($POST['email_mandrill_api_key']) . '@default', + 'microsoftgraph' => 'microsoftgraph+api://' . urlencode($POST['email_microsoftgraph_client_id']) . ':' . urlencode($POST['email_microsoftgraph_client_secret']) . '@default?tenantId=' . urlencode($POST['email_microsoftgraph_tenant_id']), + 'postal' => 'postal+api://' . urlencode($POST['email_postal_api_key']) . '@' . urlencode($POST['email_postal_base_url']), + 'postmark' => 'postmark+api://' . urlencode($POST['email_postmark_api_token']) . '@default', + 'resend' => 'resend+api://' . urlencode($POST['email_resend_api_key']) . '@default', + 'scaleway' => 'scaleway+api://' . urlencode($POST['email_scaleway_project_id']) . ':' . urlencode($POST['email_scaleway_api_key']) . '@default', + 'sendgrid' => 'sendgrid+api://' . urlencode($POST['email_sendgrid_api_key']) . '@default', + 'sweego' => 'sweego+api://' . urlencode($POST['email_sweego_api_key']) . '@default', }; - $GLOBALS['SMTPDebug'] = "SMTP Debug>>\n" . $GLOBALS['SMTPDebug']; - $mail->SmtpConnect(); - } catch (Exception $e) { - $GLOBALS['SMTPDebug'] = "SMTP Exception>>\n" . ($mail->ErrorInfo ?: $e->getMessage()); + $transport = Transport::fromDsn($dsn); + if ($transport instanceof SmtpTransport) { + $GLOBALS['SMTPDebug'] = ''; + $transport->start(); + $GLOBALS['SMTPDebug'] = "SMTP Debug>>\nConnected successfully"; + } else { + $GLOBALS['SMTPDebug'] = "Transport configured: {$emailMode}"; + } + } catch (Throwable $e) { + $GLOBALS['SMTPDebug'] = "Error>>\n" . $e->getMessage(); } } } diff --git a/app/legacy/routes/image.php b/app/legacy/routes/image.php index 8a79bcc..1641a86 100644 --- a/app/legacy/routes/image.php +++ b/app/legacy/routes/image.php @@ -292,6 +292,7 @@ return function (Handler $handler) { $meta_description = $image['description']; } else { $image_tr = [ + '%s' => _s(mb_ucfirst($image['type'])), '%i' => $image[$image['title'] === null ? 'filename' : 'title'], '%a' => $image['album']['name'] ?? '', '%w' => getSetting('website_name'), @@ -301,11 +302,11 @@ return function (Handler $handler) { || ( ! ((bool) ($image['user']['is_private'] ?? false)) && isset($image['album']['name']) )) { - $meta_description = _s('Image %i in %a album', $image_tr); + $meta_description = _s('%s %i in %a album', $image_tr); } elseif (isset($image['category']['id'])) { - $meta_description = _s('Image %i in %c category', $image_tr); + $meta_description = _s('%s %i in %c category', $image_tr); } else { - $meta_description = _s('Image %i hosted in %w', $image_tr); + $meta_description = _s('%s %i hosted in %w', $image_tr); } } $handler::setVar('meta_description', $meta_description ?? ''); diff --git a/app/routes/tenants-api-v4.php b/app/routes/tenants-api-v4.php index 5dacd30..b20bbd3 100644 --- a/app/routes/tenants-api-v4.php +++ b/app/routes/tenants-api-v4.php @@ -16,10 +16,12 @@ use Chevereto\Http\Controllers\Api\V4\TenantPatch; use Chevereto\Http\Controllers\Api\V4\TenantPlanDelete; use Chevereto\Http\Controllers\Api\V4\TenantPlanGet; use Chevereto\Http\Controllers\Api\V4\TenantPlanPatch; +use Chevereto\Http\Controllers\Api\V4\TenantsAuthVerifyPost; use Chevereto\Http\Controllers\Api\V4\TenantsGet; use Chevereto\Http\Controllers\Api\V4\TenantsPlansGet; use Chevereto\Http\Controllers\Api\V4\TenantsPlansPost; use Chevereto\Http\Controllers\Api\V4\TenantsPost; +use Chevereto\Http\Controllers\Api\V4\TenantUserPasswordResetPatch; use Chevereto\Http\Middlewares\RestrictIpAccess; use Chevereto\Http\Middlewares\SignedRequest; use Chevereto\Http\Middlewares\TenantsApiKeyAuthorization; @@ -28,6 +30,10 @@ use function Chevere\Router\routes; use function Chevereto\Vars\env; return routes( + route( + '/_/api/4/auth/verify', + POST: TenantsAuthVerifyPost::class, + ), route( '/_/api/4/tenants', POST: TenantsPost::class, @@ -43,6 +49,10 @@ return routes( '/_/api/4/tenants/{id}/install', POST: TenantInstallPost::class, ), + route( + '/_/api/4/tenants/{id}/user-password-reset', + PATCH: TenantUserPasswordResetPatch::class, + ), route( '/_/api/4/tenants-plans', POST: TenantsPlansPost::class, diff --git a/app/routes/tenants-internal-api-v4.php b/app/routes/tenants-internal-api-v4.php new file mode 100644 index 0000000..32f03bd --- /dev/null +++ b/app/routes/tenants-internal-api-v4.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Chevereto\Http\Controllers\Api\V4\TenantsConfigTraefikGet; +use Chevereto\Http\Middlewares\RestrictIpAccess; +use Chevereto\Http\Middlewares\TenantsApiKeyAuthorization; +use function Chevere\Router\route; +use function Chevere\Router\routes; + +return routes( + route( + '/_/api/4/config/traefik', + GET: TenantsConfigTraefikGet::class, + ), +) + ->withAppendMiddleware( + RestrictIpAccess::with( + allowList: '127.0.0.1,::1,172.16.0.0/12,192.168.65.0/24', + ), + TenantsApiKeyAuthorization::class, + ); diff --git a/app/schemas/mysql-8/_/tenants_stats.sql b/app/schemas/mysql-8/_/tenants_stats.sql index 192ebe3..237f70f 100644 --- a/app/schemas/mysql-8/_/tenants_stats.sql +++ b/app/schemas/mysql-8/_/tenants_stats.sql @@ -17,6 +17,7 @@ CREATE TABLE `%table_root_prefix%tenants_stats` ( `pages` INT UNSIGNED NOT NULL DEFAULT '0', `storages` INT UNSIGNED NOT NULL DEFAULT '0', `categories` INT UNSIGNED NOT NULL DEFAULT '0', + `login_providers` INT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`tenant_id`), KEY `updated_at` (`updated_at`), FOREIGN KEY (tenant_id) REFERENCES `%table_root_prefix%tenants` (id) ON DELETE CASCADE diff --git a/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php b/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php index 14c1c38..38a4638 100644 --- a/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php +++ b/app/src/Http/Controllers/Api/V4/TenantPlanPatch.php @@ -33,6 +33,7 @@ class TenantPlanPatch extends Controller public function __invoke(string $id): void { try { + $this->tenants->getPlan($id); $this->tenants->editPlan( planId: $id, limits: $this->bodyParsed()->optional('limits')?->array(), diff --git a/app/src/Http/Controllers/Api/V4/TenantUserPasswordResetPatch.php b/app/src/Http/Controllers/Api/V4/TenantUserPasswordResetPatch.php new file mode 100644 index 0000000..8243f7d --- /dev/null +++ b/app/src/Http/Controllers/Api/V4/TenantUserPasswordResetPatch.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Http\Controllers\Api\V4; + +use Chevere\Http\Attributes\Response; +use Chevere\Http\Controller; +use Chevere\Http\Exceptions\ControllerException; +use Chevere\Http\Status; +use Chevere\Parameter\Interfaces\ParameterInterface; +use Chevere\Writer\StreamWriter; +use Chevereto\Exceptions\NotFoundException; +use Chevereto\PCRE; +use Chevereto\Tenants\Tenants; +use function Chevere\Parameter\arrayp; +use function Chevere\Parameter\string; +use function Chevere\Standard\randomString; +use function Chevere\Writer\streamTemp; +use function Chevereto\Legacy\G\str_replace_last; +use function Chevereto\Legacy\runAppCommand; +use function Chevereto\Vars\env; + +#[Response( + new Status(201, fail: 404, conflict: 409), +)] +class TenantUserPasswordResetPatch extends Controller +{ + public function __construct( + private Tenants $tenants, + ) { + } + + public function __invoke(string $id): string + { + try { + $tenant = $this->tenants->getTenant(tenantId: $id); + } catch (NotFoundException) { + throw new ControllerException( + 'Tenant not found', + 404 + ); + } + $password = $this->bodyParsed()->optional('password')?->string() + ?? randomString(16); + $logger = new StreamWriter(streamTemp()); + $exit = runAppCommand( + command: [ + '-C', 'password-reset', + '-u', $this->bodyParsed()->required('username')->string(), + '-x', $password, + ], + env: array_merge(env(), [ + 'CHEVERETO_TENANT' => $tenant->id, + 'CHEVERETO_CACHE_KEY_PREFIX' => str_replace_last( + '_:', + '', + env()['CHEVERETO_CACHE_KEY_PREFIX'] + ), + 'CHEVERETO_DB_TABLE_PREFIX' => str_replace_last( + '_', + '', + env()['CHEVERETO_DB_TABLE_PREFIX'] + ), + ]), + isVerbose: true, + logger: $logger + ); + xr($exit); + if ($exit === 0) { + return $password; + } + + throw new ControllerException( + 'Password reset failed', + 500 + ); + } + + public static function acceptBody(): ParameterInterface + { + return arrayp( + username: string(PCRE::USER_USERNAME->value), + )->withOptional( + password: string(PCRE::USER_PASSWORD->value) + ); + } +} diff --git a/app/src/Http/Controllers/Api/V4/TenantsAuthVerifyPost.php b/app/src/Http/Controllers/Api/V4/TenantsAuthVerifyPost.php new file mode 100644 index 0000000..6867cb7 --- /dev/null +++ b/app/src/Http/Controllers/Api/V4/TenantsAuthVerifyPost.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Http\Controllers\Api\V4; + +use Chevere\Http\Attributes\Response; +use Chevere\Http\Controller; +use Chevere\Http\Header; +use Chevere\Http\Status; + +#[Response( + new Status(200), + new Header('Content-Type', 'application/json'), +)] +class TenantsAuthVerifyPost extends Controller +{ + public function __invoke(): void + { + } +} diff --git a/app/src/Http/Controllers/Api/V4/TenantsConfigTraefikGet.php b/app/src/Http/Controllers/Api/V4/TenantsConfigTraefikGet.php new file mode 100644 index 0000000..ccd9597 --- /dev/null +++ b/app/src/Http/Controllers/Api/V4/TenantsConfigTraefikGet.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Http\Controllers\Api\V4; + +use Chevere\Http\Attributes\Response; +use Chevere\Http\Controller; +use Chevere\Http\Header; +use Chevere\Http\Status; +use Chevereto\Tenants\Tenants; +use Chevereto\Tenants\TenantsConfig; +use function Chevereto\Vars\env; + +#[Response( + new Status(200), + new Header('Content-Type', 'application/json'), +)] +class TenantsConfigTraefikGet extends Controller +{ + public function __construct( + private Tenants $tenants, + private TenantsConfig $tenantsConfig, + ) { + } + + public function __invoke(): array + { + return $this->tenantsConfig->getConfig( + tenants: $this->tenants, + service: env()['CHEVERETO_SERVICE_NAME'], + port: 80, + middleware: ['cf-only'] + ); + } +} diff --git a/app/src/Legacy/Classes/DB.php b/app/src/Legacy/Classes/DB.php index a1a5739..83a24e8 100644 --- a/app/src/Legacy/Classes/DB.php +++ b/app/src/Legacy/Classes/DB.php @@ -118,7 +118,9 @@ class DB ]; $this->pdo_options = $this->pdo_default_attrs + $this->pdoAttrs; $this->pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; - $this->pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET time_zone = '+00:00', NAMES 'utf8mb4'"; + $attrInitOption = class_exists('Pdo\\Mysql') ? \Pdo\Mysql::ATTR_INIT_COMMAND : PDO::MYSQL_ATTR_INIT_COMMAND; + $this->pdo_options[] = "SET time_zone = '+00:00', NAMES 'utf8mb4'"; + $this->pdo_options[$attrInitOption] = "SET time_zone = '+00:00', NAMES 'utf8mb4'"; self::$dbh = new PDO($pdo_connect, $this->user, $this->pass, $this->pdo_options); self::$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); self::$instance = $this; diff --git a/app/src/Legacy/Classes/Settings.php b/app/src/Legacy/Classes/Settings.php index 0c01bf7..ce860a9 100644 --- a/app/src/Legacy/Classes/Settings.php +++ b/app/src/Legacy/Classes/Settings.php @@ -32,6 +32,34 @@ class Settings 'email_smtp_server_password', 'email_smtp_server_port', 'email_smtp_server_username', + 'email_ahasend_api_key', + 'email_ses_access_key', + 'email_ses_secret_key', + 'email_azure_resource_name', + 'email_azure_key', + 'email_brevo_api_key', + 'email_infobip_api_key', + 'email_infobip_base_url', + 'email_mailgun_api_key', + 'email_mailgun_domain', + 'email_mailjet_access_key', + 'email_mailjet_secret_key', + 'email_mailomat_api_key', + 'email_mailpace_api_token', + 'email_mailersend_api_key', + 'email_mailtrap_api_token', + 'email_mandrill_api_key', + 'email_microsoftgraph_client_id', + 'email_microsoftgraph_client_secret', + 'email_microsoftgraph_tenant_id', + 'email_postal_api_key', + 'email_postal_base_url', + 'email_postmark_api_token', + 'email_resend_api_key', + 'email_scaleway_project_id', + 'email_scaleway_api_key', + 'email_sendgrid_api_key', + 'email_sweego_api_key', 'captcha_secret', 'disqus_secret_key', 'akismet_api_key', @@ -312,6 +340,13 @@ class Settings 'upload_image_path' => 'images', ], ], + 'CHEVERETO_ENABLE_GUESTS' => ['0', + [ + 'enable_api_guest' => false, + 'guest_uploads' => false, + 'guest_albums' => false, + ], + ], ]; public const STOCK = [ @@ -421,6 +456,34 @@ class Settings 'theme_palette_user_select' => true, 'enable_api_user' => true, 'enable_api_guest' => false, + 'email_ahasend_api_key' => '', + 'email_ses_access_key' => '', + 'email_ses_secret_key' => '', + 'email_azure_resource_name' => '', + 'email_azure_key' => '', + 'email_brevo_api_key' => '', + 'email_infobip_api_key' => '', + 'email_infobip_base_url' => '', + 'email_mailgun_api_key' => '', + 'email_mailgun_domain' => '', + 'email_mailjet_access_key' => '', + 'email_mailjet_secret_key' => '', + 'email_mailomat_api_key' => '', + 'email_mailpace_api_token' => '', + 'email_mailersend_api_key' => '', + 'email_mailtrap_api_token' => '', + 'email_mandrill_api_key' => '', + 'email_microsoftgraph_client_id' => '', + 'email_microsoftgraph_client_secret' => '', + 'email_microsoftgraph_tenant_id' => '', + 'email_postal_api_key' => '', + 'email_postal_base_url' => '', + 'email_postmark_api_token' => '', + 'email_resend_api_key' => '', + 'email_scaleway_project_id' => '', + 'email_scaleway_api_key' => '', + 'email_sendgrid_api_key' => '', + 'email_sweego_api_key' => '', ]; public const USERNAME_MIN_LENGTH = 3; @@ -804,7 +867,6 @@ class Settings foreach ($binds as $bindK => $bindV) { $db->bind($bindK, $bindV); } - $return = $db->exec(); if ($return) { self::cache(); diff --git a/app/src/Legacy/Classes/Stat.php b/app/src/Legacy/Classes/Stat.php index d3923f0..861b9b3 100644 --- a/app/src/Legacy/Classes/Stat.php +++ b/app/src/Legacy/Classes/Stat.php @@ -17,7 +17,9 @@ use LogicException; use OverflowException; use function Chevere\Message\message; use function Chevereto\Legacy\G\datetimegmt; +use function Chevereto\Legacy\trialAwareLabel; use function Chevereto\Vars\env; +use function Chevereto\Vars\envTrialAware; class Stat { @@ -127,7 +129,7 @@ class Stat 600 ); } - $maxLimit = (int) (env()[$env] ?? 0); + $maxLimit = (int) (envTrialAware()[$env] ?? 0); if ($maxLimit === 0) { return; } @@ -135,7 +137,7 @@ class Stat if (($count + $add) > $maxLimit) { throw new OverflowException( message( - 'Maximum %t% reached (limit %s%).', + 'Maximum %t% reached (limit %s%).' . trialAwareLabel(), t: $env, s: strval($maxLimit), ), @@ -449,6 +451,7 @@ class Stat 'file_likes' => 's.stat_image_likes', 'album_likes' => 's.stat_album_likes', 'storage_used' => 's.stat_disk_used', + 'login_providers' => 'u.login_providers', 'admins' => 'u.admins', 'managers' => 'u.managers', 'pages' => 'u.pages', @@ -469,9 +472,7 @@ class Stat $selectColumns = implode(',', $pairs); $select = match ($asJsonColumn) { true => << << 0) { $currentTotalTags = Stat::getTotals()['tags'] ?? 0; if ($currentTotalTags >= $maxTags) { diff --git a/app/src/Legacy/Classes/User.php b/app/src/Legacy/Classes/User.php index db24a84..9526a47 100644 --- a/app/src/Legacy/Classes/User.php +++ b/app/src/Legacy/Classes/User.php @@ -37,7 +37,9 @@ use function Chevereto\Legacy\getSetting; use function Chevereto\Legacy\headersNoCache; use function Chevereto\Legacy\linkify_redirector; use function Chevereto\Legacy\system_notification_email; +use function Chevereto\Legacy\trialAwareLabel; use function Chevereto\Vars\env; +use function Chevereto\Vars\envTrialAware; class User { @@ -134,37 +136,40 @@ class User } else { $userAlbums = []; $user_stream = self::getStreamAlbum($var); - if ($user_stream === null || $user_stream['user_album_count'] === 0) { + if ($user_stream === null) { return []; } + $userAlbumsCount = $user_stream['user_album_count']; unset($user_stream['user_album_count']); $userAlbums['stream'] = $user_stream; $map = []; $children = []; - $columns = [ - 'album_id', - 'album_name', - 'album_privacy', - 'album_parent_id', - 'album_image_count', - 'album_cover_id', - ]; - $columnsString = implode(', ', $columns); - $tableAlbums = DB::getTable('albums'); - $db = DB::getInstance(); - $db->query( - <<bind(':limit', intval(env()['CHEVERETO_MAX_USER_ALBUMS_LIST'])); - $db->bind(':image_user_id', $id); - $user_albums_db = $db->fetchAll(); - if ($user_albums_db) { - $userAlbums += $user_albums_db; + if ($userAlbumsCount > 0) { + $columns = [ + 'album_id', + 'album_name', + 'album_privacy', + 'album_parent_id', + 'album_image_count', + 'album_cover_id', + ]; + $columnsString = implode(', ', $columns); + $tableAlbums = DB::getTable('albums'); + $db = DB::getInstance(); + $db->query( + <<bind(':limit', intval(env()['CHEVERETO_MAX_USER_ALBUMS_LIST'])); + $db->bind(':image_user_id', $id); + $user_albums_db = $db->fetchAll(); + if ($user_albums_db) { + $userAlbums += $user_albums_db; + } } foreach ($userAlbums as $k => &$v) { $album_id = isset($v['album_id']) @@ -343,7 +348,7 @@ class User if (! array_key_exists($role, $roles)) { throw new Exception('Invalid role', 600); } - $maxLimit = (int) env()[$roleHandle] ?? 0; + $maxLimit = (int) envTrialAware()[$roleHandle] ?? 0; if ($maxLimit === 0) { return; } @@ -358,7 +363,7 @@ class User if (($count + 1) > $maxLimit) { throw new OverflowException( message( - 'Maximum %u% for role %r% reached (limit %c%)', + 'Maximum %u% for role %r% reached (limit %c%)' . trialAwareLabel(), u: _n('user', 'users', 20), c: strval($maxLimit), r: mb_strtolower($roleLabel), diff --git a/app/src/Legacy/functions.php b/app/src/Legacy/functions.php index 1c8e4a0..eb1a8c2 100644 --- a/app/src/Legacy/functions.php +++ b/app/src/Legacy/functions.php @@ -31,7 +31,6 @@ use Chevereto\Legacy\Classes\KeyValue; use Chevereto\Legacy\Classes\KeyValueNull; use Chevereto\Legacy\Classes\L10n; use Chevereto\Legacy\Classes\Login; -use Chevereto\Legacy\Classes\Mailer; use Chevereto\Legacy\Classes\Settings; use Chevereto\Legacy\Classes\StorageApis; use Chevereto\Legacy\Classes\Upload; @@ -56,9 +55,12 @@ use LogicException; use OutOfBoundsException; use OverflowException; use PDO; -use PHPMailer\PHPMailer\SMTP; use Redis; use RuntimeException; +use Symfony\Component\Mailer\Mailer; +use Symfony\Component\Mailer\Transport; +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Email; use Symfony\Component\Process\Process; use Throwable; use function Chevere\Filesystem\filePhpForPath; @@ -94,6 +96,7 @@ use function Chevereto\Legacy\G\starts_with; use function Chevereto\Legacy\G\unlinkIfExists; use function Chevereto\Vars\cookie; use function Chevereto\Vars\env; +use function Chevereto\Vars\envTrialAware; use function Chevereto\Vars\post; use function Chevereto\Vars\server; use function Chevereto\Vars\session; @@ -195,55 +198,76 @@ function send_mail($to, $subject, $body): bool if (! filter_var($to, FILTER_VALIDATE_EMAIL)) { throw new Exception('Invalid to email', 100); } - $writer = new StreamWriter(streamFor('php://temp', 'r+')); $body = trim($body); - $mail = new Mailer(); - $mail->SMTPDebug = SMTP::DEBUG_SERVER; - $mail->Debugoutput = function ($str, $level) use ($writer) { - $writer->write("{$str} \n"); - }; - $alt_body = $mail->html2text($body); - $mail->CharSet = 'UTF-8'; - if (getSetting('email_mode') === 'smtp') { - $mail->isSMTP(); - $mail->Username = getSetting('email_smtp_server_username') ?? ''; - $mail->Password = getSetting('email_smtp_server_password') ?? ''; - $mail->SMTPAuth = $mail->Username !== '' || $mail->Password !== ''; - $mail->SMTPSecure = in_array(getSetting('email_smtp_server_security'), ['ssl', 'tls'], true) - ? getSetting('email_smtp_server_security') - : ''; - $mail->SMTPAutoTLS = in_array(getSetting('email_smtp_server_security'), ['ssl', 'tls'], true); - $mail->Port = getSetting('email_smtp_server_port'); - $mail->Host = getSetting('email_smtp_server'); - } - $mail->Timeout = 30; - $mail->Subject = $subject; - if ($body !== $alt_body) { - $mail->IsHTML(true); - $mail->Body = $mail->normalizeBreaks($body); - $mail->AltBody = $mail->normalizeBreaks($alt_body); - } else { - $mail->Body = $body; - } - $mail->addAddress($to); + $alt_body = strip_tags($body); + $email = new Email(); + $email->subject($subject); + $email->to($to); + $email->from(new Address($from[0], $from[1])); if ($reply_to && is_array($reply_to)) { foreach ($reply_to as $v) { - $mail->addReplyTo($v); + $email->addReplyTo($v); } } - $mail->setFrom($from[0], $from[1]); - if ($mail->Send()) { - return true; + if ($body !== $alt_body) { + $email->html($body); + $email->text($alt_body); + } else { + $email->text($body); } - $mailerWrap = "\n----------- MAILER DEBUG -----------\n\n"; - $error = str_replace('-', '>', $mailerWrap) - . $writer->__toString() - . str_replace('-', '<', $mailerWrap); - writers()->error() - ->write($error); - xr(mailer: $error, to: $to, subject: $subject, body: $body); + $emailMode = getSetting('email_mode') ?? 'mail'; + $dsn = match ($emailMode) { + 'smtp' => (function (): string { + $username = urlencode(getSetting('email_smtp_server_username') ?? ''); + $password = urlencode(getSetting('email_smtp_server_password') ?? ''); + $host = getSetting('email_smtp_server') ?? 'localhost'; + $port = getSetting('email_smtp_server_port') ?? 25; + $security = getSetting('email_smtp_server_security'); + $scheme = $security === 'ssl' ? 'smtps' : 'smtp'; + $auth = ($username !== '' || $password !== '') ? "{$username}:{$password}@" : ''; + $dsn = "{$scheme}://{$auth}{$host}:{$port}"; + if ($security === 'tls') { + $dsn .= '?encryption=tls'; + } elseif (! in_array($security, ['ssl', 'tls'], true)) { + $dsn .= '?verify_peer=false'; + } - throw new Exception($mail->ErrorInfo, 606); + return $dsn; + })(), + 'ahasend' => 'ahasend+api://' . urlencode(getSetting('email_ahasend_api_key') ?? '') . '@default', + 'ses' => 'ses+api://' . urlencode(getSetting('email_ses_access_key') ?? '') . ':' . urlencode(getSetting('email_ses_secret_key') ?? '') . '@default', + 'azure' => 'azure+api://' . urlencode(getSetting('email_azure_resource_name') ?? '') . ':' . urlencode(getSetting('email_azure_key') ?? '') . '@default', + 'brevo' => 'brevo+api://' . urlencode(getSetting('email_brevo_api_key') ?? '') . '@default', + 'infobip' => 'infobip+api://' . urlencode(getSetting('email_infobip_api_key') ?? '') . '@' . urlencode(getSetting('email_infobip_base_url') ?? 'default'), + 'mailgun' => 'mailgun+api://' . urlencode(getSetting('email_mailgun_api_key') ?? '') . ':' . urlencode(getSetting('email_mailgun_domain') ?? '') . '@default', + 'mailjet' => 'mailjet+api://' . urlencode(getSetting('email_mailjet_access_key') ?? '') . ':' . urlencode(getSetting('email_mailjet_secret_key') ?? '') . '@default', + 'mailomat' => 'mailomat+api://' . urlencode(getSetting('email_mailomat_api_key') ?? '') . '@default', + 'mailpace' => 'mailpace+api://' . urlencode(getSetting('email_mailpace_api_token') ?? '') . '@default', + 'mailersend' => 'mailersend+api://' . urlencode(getSetting('email_mailersend_api_key') ?? '') . '@default', + 'mailtrap' => 'mailtrap+api://' . urlencode(getSetting('email_mailtrap_api_token') ?? '') . '@default', + 'mandrill' => 'mandrill+api://' . urlencode(getSetting('email_mandrill_api_key') ?? '') . '@default', + 'microsoftgraph' => 'microsoftgraph+api://' . urlencode(getSetting('email_microsoftgraph_client_id') ?? '') . ':' . urlencode(getSetting('email_microsoftgraph_client_secret') ?? '') . '@default?tenantId=' . urlencode(getSetting('email_microsoftgraph_tenant_id') ?? ''), + 'postal' => 'postal+api://' . urlencode(getSetting('email_postal_api_key') ?? '') . '@' . urlencode(getSetting('email_postal_base_url') ?? 'default'), + 'postmark' => 'postmark+api://' . urlencode(getSetting('email_postmark_api_token') ?? '') . '@default', + 'resend' => 'resend+api://' . urlencode(getSetting('email_resend_api_key') ?? '') . '@default', + 'scaleway' => 'scaleway+api://' . urlencode(getSetting('email_scaleway_project_id') ?? '') . ':' . urlencode(getSetting('email_scaleway_api_key') ?? '') . '@default', + 'sendgrid' => 'sendgrid+api://' . urlencode(getSetting('email_sendgrid_api_key') ?? '') . '@default', + 'sweego' => 'sweego+api://' . urlencode(getSetting('email_sweego_api_key') ?? '') . '@default', + default => 'sendmail://default', + }; + + try { + $transport = Transport::fromDsn($dsn); + $mailer = new Mailer($transport); + $mailer->send($email); + } catch (\Throwable $e) { + writers()->error()->write($e->getMessage()); + xr(mailer: $e->getMessage(), to: $to, subject: $subject, body: $body); + + throw new Exception($e->getMessage(), 606); + } + + return true; } function get_chevereto_version(bool $full = true): string @@ -1179,12 +1203,27 @@ function loaderHandler( ?? ''; $envVar['CHEVERETO_TENANT_HANDLE'] = ''; $envVar['CHEVERETO_DB_TABLE_ROOT_PREFIX'] = $envVar['CHEVERETO_DB_TABLE_PREFIX']; - if ($envVar['CHEVERETO_ENABLE_TENANTS'] === '1') { + $envVar['CHEVERETO_CACHE_KEY_ROOT_PREFIX'] = $envVar['CHEVERETO_CACHE_KEY_PREFIX']; + // try { + // $xrArguments = [ + // 'isEnabled' => true, + // 'isHttps' => false, + // 'host' => 'host.docker.internal', + // 'port' => 27420, + // ]; + + // new XrInstance(new Xr(...$xrArguments)); + // } catch (Throwable) { + // // Silent failover + // } + $isTenantsApi = false; + if ($envVar['CHEVERETO_ENABLE_TENANTS'] === '1' || $envVar['CHEVERETO_TENANT'] !== '') { $redis = new Redis(); $redis->connect($envVar['CHEVERETO_CACHE_HOST'], (int) $envVar['CHEVERETO_CACHE_PORT']); if ($envVar['CHEVERETO_CACHE_PASSWORD'] !== '') { $redis->auth($envVar['CHEVERETO_CACHE_PASSWORD']); } + $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); $lookupNamespace = $envVar['CHEVERETO_CACHE_KEY_PREFIX'] . '_:'; if (PHP_SAPI === 'cli') { $websiteId = $envVar['CHEVERETO_TENANT']; @@ -1195,13 +1234,19 @@ function loaderHandler( PLAIN; exit(255); } - $websiteOptions = $redis->get($lookupNamespace . 'tenant:' . $websiteId); - $websiteOptions = unserialize($websiteOptions); - $hostname = $websiteOptions['hostname']; + /** @var array $websiteOptions */ + $websiteOptions = $redis->get($lookupNamespace . 'tenant:' . $websiteId) ?: []; + $hostname = $websiteOptions['hostname'] ?? ''; } else { $hostname = $_server['SERVER_NAME']; + if (($envVar['CHEVERETO_SERVICING'] ?? '') === 'docker' + && $hostname === 'host.docker.internal' + ) { + $hostname = $envVar['CHEVERETO_HOSTNAME']; + } $isRootHostname = hash_equals($envVar['CHEVERETO_HOSTNAME'], $hostname); - $isTenantsApi = $isRootHostname + $isLocalhost = in_array($hostname, ['localhost', '127.0.0.1', '::1', $envVar['CHEVERETO_SERVICE_NAME']], true); + $isTenantsApi = ($isRootHostname || $isLocalhost) && str_starts_with( $_server['REQUEST_URI'], $envVar['CHEVERETO_HOSTNAME_PATH'] @@ -1220,17 +1265,15 @@ function loaderHandler( } else { $websiteId = $redis->get($lookupNamespace . 'hostname:' . $hostname); if ($websiteId === false) { - if ($isRootHostname) { - redirect($envVar['CHEVERETO_PROVIDER'] ?? 'https://chevereto.com'); - } + http_response_code(404); echo <<get($lookupNamespace . 'tenant:' . $websiteId); - $websiteOptions = unserialize($websiteOptions); + /** @var array $websiteOptions */ + $websiteOptions = $redis->get($lookupNamespace . 'tenant:' . $websiteId) ?: []; } } if ($websiteOptions === []) { @@ -1268,8 +1311,8 @@ function loaderHandler( $envVar['CHEVERETO_TENANT_HANDLE'] = "{$websiteId}_"; $envVar['CHEVERETO_HOSTNAME'] = $hostname; if ($websiteId !== '') { - $envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= "{$websiteId}:"; // chv:ABC: - $envVar['CHEVERETO_DB_TABLE_PREFIX'] .= "{$websiteId}_"; // chv_ABC_ + $envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= "{$websiteId}:"; // chv:ABC: (tenant) + $envVar['CHEVERETO_DB_TABLE_PREFIX'] .= "{$websiteId}_"; // chv_ABC_ (tenant) } else { $envVar['CHEVERETO_CACHE_KEY_PREFIX'] .= '_:'; // chv:_: (global) $envVar['CHEVERETO_DB_TABLE_PREFIX'] .= '_'; // chv__ (global) @@ -1423,6 +1466,7 @@ function loaderHandler( if (env()['CHEVERETO_CACHE_PASSWORD'] !== '') { $redis->auth(env()['CHEVERETO_CACHE_PASSWORD']); } + $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); $keyValue = new KeyValue( $redis, env()['CHEVERETO_CACHE_KEY_PREFIX'], @@ -1435,7 +1479,13 @@ function loaderHandler( ); } new Cache($keyValue); - if ($_session === [] + $isAPI = str_starts_with( + server()['REQUEST_URI'] ?? '', + env()['CHEVERETO_HOSTNAME_PATH'] + . '/api/', + ); + if (! ($isAPI || $isTenantsApi) + && $_session === [] && session_status() === PHP_SESSION_NONE && ACCESS === 'web' ) { @@ -1489,7 +1539,8 @@ function loaderHandler( ); } define('HTTP_APP_PROTOCOL', Config::host()->isHttps() ? 'https' : 'http'); - $httpPort = ! in_array(server()['SERVER_PORT'] ?? '80', ['80', '443'], false) + // TODO: Enable ENV to force using the port? + $httpPort = ! in_array(server()['SERVER_PORT'] ?? '80', ['80', '8080', '443'], false) ? ':' . server()['SERVER_PORT'] : ''; define('URL_APP_PUBLIC', HTTP_APP_PROTOCOL . '://' . Config::host()->hostname() . $httpPort . Config::host()->hostnamePath()); @@ -1851,6 +1902,14 @@ function getCounts(string ...$table): array return DB::queryFetchSingle($query); } +function trialAwareLabel(): string +{ + return match ('1') { + env()['CHEVERETO_TRIAL'] => ' [trial]', + default => '', + }; +} + function assertMaxCount(string $table): void { $tablesToEnv = [ @@ -1867,7 +1926,7 @@ function assertMaxCount(string $table): void code: 400 ); } - $maxLimit = (int) (env()[$tablesToEnv[$table]] ?? 0); + $maxLimit = (int) (envTrialAware()[$tablesToEnv[$table]] ?? 0); if ($maxLimit === 0) { return; } @@ -1875,7 +1934,7 @@ function assertMaxCount(string $table): void if (($count + 1) > $maxLimit) { throw new OverflowException( message( - 'Maximum number of %t% reached (limit %s%).', + 'Maximum number of %t% reached (limit %s%).' . trialAwareLabel(), t: $table, s: strval($maxLimit), ), @@ -1959,20 +2018,41 @@ function hashString(string $string): string function getPoweredByRemarks(): array { + $responsible = match (env()['CHEVERETO_CONTEXT']) { + 'saas' => _s('operator'), + default => _s('owner'), + }; $termsLink = 'Terms of Service'; - $softwareLicenseLink = 'Chevereto License'; - if (env()['CHEVERETO_EDITION'] === 'free') { - $softwareLicenseLink = 'AGPL-3.0 license'; + $softwareLicenseLink = match (env()['CHEVERETO_EDITION']) { + 'free' => 'AGPL-3.0 license', + default => 'Chevereto License', + }; + $websiteName = getSetting('website_name'); + if (strtolower($websiteName) === 'chevereto') { + $websiteName = 'This website'; } - $providerLink = '' . env()['CHEVERETO_PROVIDER_NAME'] . ''; + $provider = match (env()['CHEVERETO_CONTEXT']) { + 'saas' => [ + 'url' => env()['CHEVERETO_PROVIDER_URL'], + 'label' => env()['CHEVERETO_PROVIDER_NAME'], + ], + default => [ + 'url' => get_public_url(), + 'label' => $websiteName, + ], + }; + $providerLink = message( + '{{ label }}', + ...$provider + ); $about = _s('This service is based on Chevereto %edition edition software licensed under the %license.', [ '%edition' => ucfirst(env()['CHEVERETO_EDITION']), '%license' => $softwareLicenseLink, ]); $liability = _s("This website is hosted in a service layer not provided by Chevereto Software, which hereby declare to do not have any control nor access to the management layer of this website and it won't be responsible for this service neither the damages that this service may cause."); - $content = _s('File uploads are stored and served from storage facilities provided by %s and managed by The Service Operator.', $providerLink); + $content = _s('File uploads are stored and served from storage facilities provided and managed by the %s of this website.', $responsible); if (env()['CHEVERETO_CONTEXT'] === 'saas') { $about = _s('This service operates using Chevereto %edition edition software licensed under the %license.', [ '%edition' => ucfirst(env()['CHEVERETO_EDITION']), @@ -1989,7 +2069,7 @@ function getPoweredByRemarks(): array $liability = _s('This website is hosted on a service layer provided by %s. Chevereto Software is not responsible for the operation of this service, nor for any damages that may result from its use.', $providerLink); } if (env()['CHEVERETO_ENABLE_LOCAL_STORAGE'] === '0') { - $content = _s('File uploads are stored and served using external storage providers configured by The Service Operator.') + $content = _s('File uploads are stored and served using external storage providers configured by the %s of this website.', $responsible) . ' ' . _s('%s only hosts the database and application service layer.', $providerLink) . ' ' @@ -2029,8 +2109,7 @@ function runAppCommand( } $logger->write( <<cacheRootPrefix = env()['CHEVERETO_CACHE_KEY_ROOT_PREFIX']; // chv: $this->cachePrefix = env()['CHEVERETO_CACHE_KEY_PREFIX']; // chv:: $this->tableRootPrefix = env()['CHEVERETO_DB_TABLE_ROOT_PREFIX']; // chv__ } @@ -226,7 +230,7 @@ class Tenants $tenantKey = $this->getCacheKey('tenant', $tenantId); $tenantCache = $this->redis->get($tenantKey); if ($tenantCache && $tenant === null) { - $tenant = unserialize($tenantCache); + $tenant = $tenantCache; } $hostname = $tenant['hostname'] ?? null; if ($hostname !== null) { @@ -250,6 +254,24 @@ class Tenants PLAIN ); } + $tenantCachePattern = $this->cacheRootPrefix . $tenantId . ':*'; + $iterator = null; + while ($iterator !== 0) { + $scan = $this->redis->scan($iterator, "{$tenantCachePattern}"); + foreach ($scan as $key) { + $result = (bool) $this->redis->del($key); + $status = 'DELETE'; + if ($result === false && ! $this->redis->get($key)) { + $status = ' 404'; + } + $this->logger->write( + << {$key} + + PLAIN + ); + } + } if ($dropTables) { $likePattern = "{$this->tableRootPrefix}{$tenantId}_%"; $this->db->query( @@ -371,7 +393,8 @@ class Tenants 'managers', s.managers, 'pages', s.pages, 'storages', s.storages, - 'categories', s.categories + 'categories', s.categories, + 'login_providers', s.login_providers ) AS stats FROM `{$tableTenantsStats}` AS s WHERE s.tenant_id = t.id @@ -464,12 +487,14 @@ class Tenants $this->mergeTenantCacheable($tenant); $cached = $this->redis->get($tenantKey); if ($cached) { - /** @var array $current */ - $current = unserialize($cached); - $currentHostname = $current['hostname']; - if ($currentHostname !== $tenant['hostname']) { - $currentKey = $this->getCacheKey('hostname', $tenant['hostname']); - $this->redis->del($currentKey); + try { + /** @var array $cached */ + $cachedHostname = $cached['hostname']; + if ($cachedHostname !== $tenant['hostname']) { + $cachedKey = $this->getCacheKey('hostname', $cachedHostname); + $this->redis->del($cachedKey); + } + } catch (ErrorException) { } } $this->cacheTenantArray($tenant); @@ -700,8 +725,6 @@ class Tenants $tableTenants = $this->db::getTable('tenants'); $tableTenantsPlans = $this->db::getTable('tenants_plans'); $tableTenantsStats = $this->db::getTable('tenants_stats'); - $tablePrefixTenant = $this->tableRootPrefix . $tenantId . '_'; - $statQuery = Stat::getStatQuery($tablePrefixTenant); $this->db->query( <<redis->mset( [ $hostnameKey => $tenant['id'], - $tenantKey => serialize($tenant), + $tenantKey => $tenant, ] ); } diff --git a/app/src/Tenants/TenantsConfig.php b/app/src/Tenants/TenantsConfig.php new file mode 100644 index 0000000..5dd5618 --- /dev/null +++ b/app/src/Tenants/TenantsConfig.php @@ -0,0 +1,146 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Tenants; + +use Redis; +use stdClass; +use Throwable; + +/** + * Generates Traefik dynamic configuration for all tenants. + */ +final class TenantsConfig +{ + public const CF_RANGES = [ + '173.245.48.0/20', + '103.21.244.0/22', + '103.22.200.0/22', + '103.31.4.0/22', + '141.101.64.0/18', + '108.162.192.0/18', + '190.93.240.0/20', + '188.114.96.0/20', + '197.234.240.0/22', + '198.41.128.0/17', + '162.158.0.0/15', + '104.16.0.0/13', + '104.24.0.0/14', + '172.64.0.0/13', + '131.0.72.0/22', + '2400:cb00::/32', + '2606:4700::/32', + '2803:f800::/32', + '2405:b500::/32', + '2405:8100::/32', + '2a06:98c0::/29', + '2c0f:f248::/32', + ]; + + public function __construct( + public readonly Redis $redis, + ) { + } + + public function getConfig( + Tenants $tenants, + string $service, + int $port, + array $middleware + ): array { + $middlewares = []; + if (in_array('cf-only', $middleware)) { + $middlewares['cf-only'] = [ + 'ipAllowList' => [ + 'sourceRange' => $this->getCFRanges(), + ], + ]; + } + $rows = $tenants->getTenantsRows(); + $routers = []; + foreach ($rows as $row) { + $row = array_merge($row, [ + 'limits' => [], + 'env' => [], + ]); + $tenant = Tenant::fromRow($row); + $routers[$tenant->id] = $this->getTenantRouter( + $tenant, + $service, + array_keys($middlewares) + ); + } + + return [ + 'http' => [ + 'routers' => $routers, + 'services' => [ + $service => [ + 'loadBalancer' => [ + 'servers' => [ + [ + 'url' => sprintf( + 'http://%s:%d', + $service, + $port + ), + ], + ], + 'passHostHeader' => true, + ], + ], + ], + 'middlewares' => $middlewares, + ], + ]; + } + + public function getTenantRouter(Tenant $tenant, string $service, array $middlewares): array + { + return [ + 'rule' => "Host(`{$tenant->hostname}`)", + 'service' => $service, + 'entryPoints' => ['websecure'], + 'tls' => new stdClass(), + 'middlewares' => $middlewares, + ]; + } + + public function getCFRanges(): array + { + $cacheKey = 'cf:ip-ranges'; + $cached = $this->redis->get($cacheKey); + if ($cached !== false) { + return json_decode($cached, true); + } + + try { + $v4 = file_get_contents('https://www.cloudflare.com/ips-v4'); + $v6 = file_get_contents('https://www.cloudflare.com/ips-v6'); + $ranges = array_values( + array_filter( + array_map( + 'trim', + array_merge( + explode("\n", $v4), + explode("\n", $v6), + ) + ) + ) + ); + } catch (Throwable) { + return self::CF_RANGES; + } + $this->redis->setex($cacheKey, 3600, json_encode($ranges)); + + return $ranges; + } +} diff --git a/app/src/Vars/functions.php b/app/src/Vars/functions.php index 393733f..28706da 100644 --- a/app/src/Vars/functions.php +++ b/app/src/Vars/functions.php @@ -28,6 +28,55 @@ function env(): array return $cache; } +/** + * Returns the ENV array but limited when CHEVERETO_TRIAL='1' by + * * `CHEVERETO_TRIAL_MAX_*` (numeric limits) and + * * `CHEVERETO_TRIAL_ENABLE_*` (boolean flags). + * + * The trial variables may only be used to *decrease* the value of the + * corresponding default. In other words, if the trial value is more + * permissive than the default, the default value will always be returned. + * This keeps the SaaS trial from accidentally granting greater privileges + * than the shipped product. + */ +function envTrialAware(): array +{ + if (env()['CHEVERETO_TRIAL'] !== '1') { + return env(); + } + static $cache; + if (! isset($cache)) { + $cache = []; + /** @var string $value */ + foreach (env() as $key => $value) { + $defaultValue = $value; + if (str_starts_with($key, 'CHEVERETO_MAX_')) { + $trialMax = 'CHEVERETO_TRIAL_MAX_' . substr($key, strlen('CHEVERETO_MAX_')); + /** @var string $trialValue */ + $trialValue = array_key_exists($trialMax, env()) + ? env()[$trialMax] + : '0'; + $cache[$key] = intval($trialValue) > intval($defaultValue) + ? $defaultValue + : $trialValue; + } elseif (str_starts_with($key, 'CHEVERETO_ENABLE_')) { + $trialEnable = 'CHEVERETO_TRIAL_ENABLE_' . substr($key, strlen('CHEVERETO_ENABLE_')); + /** @var string $trialValue */ + $trialValue = array_key_exists($trialEnable, env()) + ? env()[$trialEnable] + : '0'; + $cache[$key] = intval($trialValue) > intval($defaultValue) + ? $defaultValue + : $trialValue; + } else { + $cache[$key] = $value; + } + } + } + + return $cache; +} + function request(): array { static $cache; diff --git a/content/images/system/default/home_cover.jpg b/content/images/system/default/home_cover.jpg index 489f54b..8356d6d 100644 Binary files a/content/images/system/default/home_cover.jpg and b/content/images/system/default/home_cover.jpg differ diff --git a/content/legacy/themes/Peafowl/lib/peafowl.css b/content/legacy/themes/Peafowl/lib/peafowl.css index 349c916..a73e46c 100644 --- a/content/legacy/themes/Peafowl/lib/peafowl.css +++ b/content/legacy/themes/Peafowl/lib/peafowl.css @@ -3353,6 +3353,11 @@ body.landing .top-btn-text { padding: 10px 0; } +.panel-thumb-list a { + display: block; + line-height: 0; +} + .panel-thumb-list img { display: block; width: 47px; @@ -4527,6 +4532,7 @@ a.top-user-avatar { .header-content .user-image img, .header .user-image img { border-radius: 50%; + -o-object-fit: cover; object-fit: cover; } diff --git a/content/legacy/themes/Peafowl/lib/peafowl.min.css b/content/legacy/themes/Peafowl/lib/peafowl.min.css index ab791b1..7262c14 100644 --- a/content/legacy/themes/Peafowl/lib/peafowl.min.css +++ b/content/legacy/themes/Peafowl/lib/peafowl.min.css @@ -1 +1 @@ -:root{--colorBlue:rgb(0, 110, 219);--colorBlueHover:rgb(0, 119, 237);--colorGreen:#2ecc71;--colorGreenHover:#27ae60;--colorOrange:#e67e22;--colorOrangeHover:#d35400;--colorPurple:#9b59b6;--colorPurpleHover:#8e44ad;--colorRed:#e74c3c;--colorRedHover:#c0392b;--colorYellow:#f1c40f;--colorYellowHover:#f39c12}:root{color-scheme:light;--colorSuccess:var(--colorGreen);--colorFail:var(--colorRed);--alertAccent:#f1c40f;--alertBackground:#fff5b3;--alertText:#161c1d;--backgroundDarkAlpha:rgb(0 0 0 / 80%);--backgroundLightAlpha:rgb(255 255 255 / 90%);--bodyBackground:#FFF;--bodyEmpty:#e2e8e9;--bodySeparator:#e2e8e9;--bodyText:#161c1d;--bodyTextDisabled:#c5d1d3;--bodyTextSubtle:#6c7779;--buttonAccentBackground:var(--colorAccent);--buttonAccentHoverBackground:var(--colorAccentStrong);--buttonAccentHoverText:var(--buttonAccentText);--buttonAccentText:#FFF;--buttonDefaultBackground:#d9e1e2;--buttonDefaultBorder:var(--buttonDefaultBackground);--buttonDefaultHoverBackground:#c0def2;--buttonDefaultHoverBorder:var(--buttonDefaultHoverBackground);--buttonDefaultHoverText:var(--buttonAccentBackground);--buttonDefaultText:#161c1d;--colorAccent:var(--colorBlue);--colorAccentStrong:var(--colorBlueHover);--inputBackground:#ecf0f1;--inputPlaceholderText:#8aa2a8;--inputText:#161c1d;--linkText:rgb(0, 102, 204);--menuBackground:hsla(0, 5.9%, 98.9%, .7);--menuItemHoverBackground:var(--colorAccent);--menuItemHoverText:#FFF;--menuItemText:#161c1d;--menuSeparator:rgba(11, 14, 15, 0.1);--menuBorder:var(--menuSeparator);--menuText:#161c1d;--modalBackground:var(--bodyBackground);--modalText:#161c1d;--topBarBackground:rgb(255 255 255);--topSubBarBackground:var(--topBarBackground);--topBarText:#161c1d;--viewerBackground:#323232;--listItemText:#FFF}*{-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.btn,.btn-container,.input-search,.link,.list-item,.no-select,.pop-btn-text,.top-btn-text,.user-select-none{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.animate{transition:all .2s ease-in-out}.animate--slow{transition-duration:.4s}[type=search]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}::-webkit-input-placeholder{color:var(--inputPlaceholderText);line-height:140%}:-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}::-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}:-ms-input-placeholder{color:var(--inputPlaceholderText)}:focus::-webkit-input-placeholder{color:var(--inputPlaceholderText)}:focus:-moz-placeholder{color:var(--inputPlaceholderText)}:focus::-moz-placeholder{color:var(--inputPlaceholderText)}focus:-ms-input-placeholder{color:var(--inputPlaceholderText)}::-moz-focus-inner{border:0;padding:0;margin:0}::-ms-clear{display:none}body{min-height:100vh;min-height:100dvh;min-height:-webkit-fill-available;-webkit-font-smoothing:subpixel-antialiased}[type=submit]:focus,button:focus{outline:0}html{height:100%;height:-webkit-fill-available}body,html{min-height:100vh;min-height:100dvh;font-family:Helvetica,Arial,sans-serif;color:var(--bodyText);font-size:16px;background:var(--bodyBackground);-webkit-text-size-adjust:100%}kbd{font-family:inherit}.pointer-events-none{pointer-events:none}#menu-fullscreen,#pop-box-mask.fullscreen{height:100%}#menu-fullscreen,.pop-box{transition:transform 350ms cubic-bezier(.4,0,0,1),opacity 350ms cubic-bezier(.4,0,0,1)}#menu-fullscreen>ul{position:relative;z-index:1000;background:var(--topBarBackground);color:var(--topBarText)}body.no-margin-top{margin-top:0;padding-top:0}.content-width{width:100%;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-margin-start:auto;margin-inline-start:auto;position:relative;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}a{color:var(--linkText);text-decoration:none;cursor:pointer;outline:0}a[rel=external]::after{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-start:.25em;margin-inline-start:.25em;content:"\f35d";font-size:90%}a[role=button]:hover{text-decoration:none}a:focus,a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1}.ui-selectable-helper{background:var(--colorAccent);border:2px dashed var(--topBarBackground);position:absolute;z-index:500;opacity:.6}.image-container{transition:transform 180ms cubic-bezier(.25,1,.5,1)}.selected .image-container,.ui-selecting .image-container{transform:scale(.5)}.selected .list-item-play-gif,.ui-selecting .list-item-play-gif{transform:scale(.75)}.selected .image-container img,.selected .image-container svg,.ui-selecting .image-container img,.ui-selecting .image-container svg{border-radius:.5em;transform:translateZ(0)}.hidden{display:none!important}.visible{display:block!important}.fab.soft-hidden,.far.soft-hidden,.fas.soft-hidden,.soft-hidden{display:none}.soft-visible{display:block}.hidden-visibility{visibility:hidden;position:absolute;top:0}.touch-scroll{overflow:auto;-webkit-overflow-scrolling:touch}.or-separator{border-top:1px solid var(--bodySeparator);text-align:center;margin:10px 0 10px 0}.or-separator span{font-size:.93em;font-weight:400;color:var(--bodySeparator);text-transform:uppercase;text-align:center;background:var(--bodyBackground);display:inline-block;position:relative;padding:0 10px;top:-10px}.highlight{color:var(--alertText);background:var(--alertBackground)}.highlight:empty{display:none}.line-through{text-decoration:line-through}.line-separator{width:100%;height:1px;background:var(--bodySeparator);display:block;margin:20px 0;border:0}.number-figures,a.number-figures{font-size:1.21em;line-height:1.21em;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;-webkit-margin-start:0;margin-inline-start:0;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator);text-align:center}.number-figures:first-child{-webkit-padding-start:0;padding-inline-start:0;-webkit-border-start:none;border-inline-start:none}.number-figures:last-child{-webkit-padding-end:0;padding-inline-end:0}.number-figures b{font-weight:inherit}.number-figures .icon-heart4{position:relative;top:1px}.number-figures span:not(.icon){color:var(--bodyTextSubtle);text-transform:uppercase;font-size:.6em}a.number-figures:hover,a.number-figures:hover *{color:var(--linkText)}.loading-indicator,.loading-text{display:inline-block;line-height:inherit;vertical-align:top}.loading-text{-webkit-margin-start:5px;margin-inline-start:5px}.btn-alt{color:var(--bodyTextSubtle);font-size:13px;font-size:.93rem;margin:0 5px;display:inline!important}.btn-alt a:first-letter{text-transform:capitalize}.phone .btn-alt{margin:5px 0 0}.btn-alt a{-webkit-margin-start:5px;margin-inline-start:5px;cursor:pointer}a.link{font-size:13px;font-size:.93rem;text-decoration:none;font-weight:400}.pop-box-menu a.link--delete,[data-action=delete],a.link--delete{color:#e74c3c}html:not(.phone) .pop-box-menu a.link--delete:hover{background-color:#e74c3c}a.link--approve{color:#2ecc71}a.link span.icon,a.link:hover span.icon{text-decoration:none}a.link:hover span{text-decoration:underline}.disabled,.disabled a{color:var(--bodyTextDisabled)}.disabled a{text-decoration:none;cursor:default}.optional{font-size:.6em;color:var(--bodyTextSubtle);font-weight:400}.text-shadow{text-shadow:2px 2px 3px rgba(0,0,0,.75);-webkit-filter:dropshadow(color=#000000, offx=2, offy=2);filter:dropshadow(color=#000000, offx=2, offy=2)}.box-shadow{box-shadow:2px 2px 3px 0 rgba(0,0,0,.45)}.silent-links a,a.silent-links{color:inherit}.close-box .icon-circle{color:var(--bodyText);position:relative}.close-box .icon-close-box{color:#fff;position:absolute;inset-inline-start:0;top:0}.transparent-canvas{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAP///9/f3yH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7);background-repeat:repeat}.transparent-canvas.dark{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAOfn58rKyiH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7)}input,select,textarea{font-family:inherit;font-size:1rem;display:inline-block}html:not(.safari) select,input,textarea{border-radius:3px;color:var(--inputText);border:1px solid transparent;background:var(--inputBackground)}input:-webkit-autofill,select:-webkit-autofill,textarea:-webkit-autofill{-webkit-text-fill-color:var(--inputText)!important}.input-focus,html:not(.safari) select:focus,input.search:focus,input:focus,textarea:focus{border-color:var(--colorAccent)}input:-webkit-autofill,input:-webkit-autofill:focus,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover{-webkit-text-fill-color:inherit;-webkit-box-shadow:inset 0 0 0 9999px transparent;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}select{font:inherit;outline:0}.text-input,textarea{outline:0}input[type=checkbox],input[type=radio]{border-radius:0;border:none;position:relative;vertical-align:baseline}.input-line-height,.text-input,input[type=text]{height:36px}.input-line-height{line-height:36px}.text-input,input[type=text]:not(.text-input),textarea{padding:7px 10px;width:100%}.ie7 .text-input,.ie7 input[type=text],.ie7 textarea{padding:10px;width:328px;height:14px}.ie8 .text-input,.ie8 input[type=text],.ie8 textarea,.ie9 .text-input,.ie9 input[type=text],.ie9 textarea{height:auto}.input,.input-label{position:relative;overflow:visible;scroll-snap-align:start}.input{margin:10px 0;font-size:1em}.input.first-child,.input:first-child{margin-top:0}.input-label{margin:20px 0}.input-label.first-child,.input:first-child{margin-top:0}.input-label h3,.input-label label,.input-label-label{font-weight:600;padding-bottom:5px;display:inline-block;font-size:1em}.input-label h3{display:block}.input-label h3 a,.input-label label a{font-weight:400}.input-label label .caption,.input-label label .optional{font-weight:400;font-size:.92em}.input-label .btn-alt{position:absolute;inset-inline-start:100%;top:23px;line-height:36px;-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.phone .input-label .btn-alt{position:static;-webkit-margin-start:0;margin-inline-start:0}.checkbox-label,.input-label{position:relative;font-size:.93em}.input .icon-input-submit{background:0 0;font-size:1.82em;color:#d9d9d9;position:absolute;inset-inline-end:.21em;top:.21em;cursor:pointer;line-height:1}.input .icon-input-submit.focus,.input .icon-input-submit:focus,.input .icon-input-submit:hover{color:var(--colorAccent)}.ie7 .input .icon-input-submit{top:2px}.ui-autocomplete{max-height:130px;overflow-y:auto;overflow-x:hidden}* html .ui-autocomplete{height:125px}.autocomplete-list{min-width:50%;position:absolute;z-index:1;inset-inline-start:0;-webkit-margin-before:0;margin-block-start:0;border:1px solid var(--bodySeparator);border-radius:var(--borderRadius);background:var(--bodyBackground);box-shadow:0 4px 14px rgba(0,0,0,.25);--borderRadius:3px}.autocomplete-list:empty{display:none}.autocomplete-list li{color:inherit;padding:4px 16px;display:block;cursor:pointer;border-bottom:1px solid var(--bodySeparator)}.autocomplete-list li:first-child{border-top-left-radius:var(--borderRadius);border-top-right-radius:var(--borderRadius)}.autocomplete-list li:last-child{border-bottom:0;border-bottom-right-radius:var(--borderRadius);border-bottom-left-radius:var(--borderRadius)}.autocomplete-list li.--focus,.autocomplete-list li:hover{background:var(--buttonAccentBackground);color:var(--buttonAccentText)}.hide-empty:empty{display:none}.input-column{width:350px}.input-warning{color:var(--bodyTextSubtle);inset-inline-end:0;top:0}.input-below{margin-top:5px;display:block;position:static}.red-warning{color:#d74634}.input-password input[type=password][id=new-password]{-webkit-padding-end:65px;padding-inline-end:65px}.input-password .input-password-strength{position:absolute;inset-inline-end:11px;top:50%;margin-top:5px}.fancy-fieldset .input-password{display:flex;align-items:center}.fancy-fieldset .input-password-strength{inset-inline-end:0;top:auto;margin-top:0}.input-password-strength{background:var(--bodyEmpty)}.input-password-strength,.input-password-strength span{display:block;width:50px;height:8px}.input-password-strength span{width:0%;background-color:transparent}.input-password-strength [data-veredict=very-weak]{background-color:#e74c3c}.input-password-strength [data-veredict=weak]{background-color:#e67e22}.input-password-strength [data-veredict=average],.input-password-strength [data-veredict=strong],.input-password-strength [data-veredict=stronger]{background-color:#2ecc71}.checkbox-label{font-size:1em;display:block;margin:5px 0;position:relative}.checkbox-label:last-child{margin-bottom:0}.checkbox-label input{position:absolute;padding:0;margin:0;-webkit-margin-start:-20px;margin-inline-start:-20px}.btn-alt.checkbox-label input{position:static;vertical-align:text-top;-webkit-margin-end:4px;margin-inline-end:4px}.phone .btn-alt.checkbox-label{display:block!important;margin:10px 0}.checkbox-label label{-webkit-padding-start:20px;padding-inline-start:20px;font-weight:400;margin:0;padding-bottom:0}.fancy-box .checkbox-label label{display:flex;align-items:flex-start}.input-search{position:relative}input.search{font-size:1em;border-radius:200px;padding:0 25px 0 32px;-webkit-padding-end:3.0666em;padding-inline-end:3.0666em;-webkit-padding-start:2.3571em;padding-inline-start:2.3571em;line-height:100%;height:26px;height:1.86em;width:100%;border:1px solid transparent;top:0;inset-inline-start:0;outline:0;vertical-align:text-bottom}input.search::-webkit-input-placeholder{font-size:1em}input.search:-moz-placeholder{font-size:1em}input.search::-moz-placeholder{font-size:1em}input.search:-ms-input-placeholder{font-size:1em}input.search.one-icon-padding,input.search.two-icon-padding{-webkit-padding-end:2em;padding-inline-end:2em}input.search.two-icon-padding{-webkit-padding-start:2.2em;padding-inline-start:2.2em}.top-bar input.search{-webkit-padding-start:calc(1.625rem + 7px);padding-inline-start:calc(1.625rem + 7px);position:relative;-webkit-padding-end:34px;padding-inline-end:34px;background:0 0;border:0;box-shadow:none!important}.top-bar input{color:var(--topBarText)}.ie7 input.search,.ie8 input.search,.ie9 input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:26px;height:26px}.ie7 input.search{padding:0;width:200px}.input-search span{position:absolute;cursor:pointer}.input-search .icon--search{color:var(--inputText);left:.85714286rem;top:50%;transform:translateY(-50%)}.top-bar .input-search .icon--search{font-size:1.28571429rem;line-height:50px;width:1.625rem;left:0;text-align:center}.input-search .icon--search,.top-btn-text .icon--search{font-size:1em;width:1em}.input-search .icon--close,.input-search .icon--settings{color:var(--inputText);padding:.5em;top:0;font-size:1em}.input-search .icon--close:hover,.input-search .icon--settings:hover{color:var(--colorAccent)}.input-search .icon--close{-webkit-padding-end:.75em;padding-inline-end:.75em;margin-right:-.5em}#menu-fullscreen .input-search .icon--settings,.input-search .icon--settings{inset-inline-end:22px}#menu-fullscreen .input-search .icon--close,.input-search .icon--close{inset-inline-end:4px}.ie7 .input-search .icon--close,.ie8 .input-search .icon--close,.ie9 .input-search .icon--close{display:none}select{-webkit-padding-start:7px!important;padding-inline-start:7px!important}.ie7 select{width:100%!important;padding:0!important;height:auto!important}select option{padding:4px 10px;margin:0}textarea{resize:both;height:80px}.input-upload{position:relative}.user-settings-avatar{min-height:160px;height:auto}.user-settings-avatar-container{position:relative}.user-settings-avatar-container,.user-settings-avatar-container .user-image{font-size:160px;width:1em;height:1em}.user-settings-avatar .loading-placeholder{position:absolute;inset-inline-start:0;top:0;background:var(--bodyEmpty)}.phone .user-settings-avatar-container{margin:0 auto 10px!important}.input-upload .btn-container{margin:0 0 5px 0}.input-upload .btn-alt{-webkit-margin-start:0;margin-inline-start:0}.arrow-down{border-width:4px 4px 0 4px;border-color:#333 transparent transparent transparent;border-color:#333 transparent transparent transparent;content:""}.arrow-down{border-style:solid;display:inline-block;height:0;width:0;vertical-align:middle}.sign-services li{display:inline-block;margin:0 4px 4px 0}.sign-service{font-size:.93em;padding:0 8px;line-height:30px;height:29px}.sign-service .btn-icon{font-size:inherit;width:auto}.sign-services-compact .btn-text{display:none}.link-service,.sign-service{color:#fff;display:inline-block;text-decoration:none!important}.link-service span,.sign-service{border-radius:3px}.link-service{font-weight:400;height:28px;position:relative}.link-service span{display:block;line-height:28px;text-align:center!important}.link-service .btn-icon{width:28px;height:28px;-webkit-margin-end:4px;margin-inline-end:4px;position:absolute;inset-inline-start:0;top:0}.link-service span.sign-text{padding:0 20px;-webkit-margin-start:32px;margin-inline-start:32px}.btn-social .btn-icon,.sign-service .icon{color:#fff;position:relative;display:inline-block}.buttons{display:flex;flex-wrap:wrap;gap:5px;justify-content:flex-start}.buttons.text-align-right{justify-content:flex-end}.phone .buttons{justify-content:center}.buttons .btn{display:inline-block;text-align:center}.btn-container{margin-top:20px;margin-bottom:20px;position:relative}.btn{height:36px;line-height:36px;height:2.57142857rem;line-height:2.57142857rem;font-family:inherit;font-size:1em;font-weight:400;padding:0 10px;border-radius:3px;cursor:pointer;display:inline-block;text-decoration:none;border:1px solid transparent;white-space:nowrap}.btn>*{pointer-events:none}.btn,.btn:active,.btn:focus,.btn:hover{text-decoration:none}.btn.default:active,.btn:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-icon{display:inline-block;text-align:center;width:1.4em}.btn-text{-webkit-margin-start:4px;margin-inline-start:4px}.btn-text:empty{display:none}.btn-big{font-size:16px;font-size:1.143rem;height:38px;line-height:38px;-webkit-padding-start:1em;padding-inline-start:1em;-webkit-padding-end:1em;padding-inline-end:1em}.btn-small{font-size:13px;height:30px;line-height:30px;font-size:.92rem;height:2.14285714rem;line-height:2.14285714rem}.btn-input{font-weight:600;font-size:.93em;-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px}.btn-32{width:32px;height:32px;text-align:center;display:inline-block}.btn-32 .btn-icon{font-size:18px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.btn-capsule{border-radius:100px;border-color:rgba(255,255,255,.1);background-color:rgba(0,0,0,.5);-webkit-backdrop-filter:blur(17.5px) saturate(1.8);backdrop-filter:blur(17.5px) saturate(1.8);background-image:none;height:auto;color:#fff;text-shadow:none;font-size:.93em;height:2.15em;line-height:2.15em;font-weight:400;padding:0 1.15em;box-shadow:none;-webkit-filter:none;filter:none}.btn-capsule:hover{background-color:rgba(0,0,0,.7);border-color:rgba(255,255,255,.3)}.no-rgba .btn-capsule{border-color:#666;background-color:none;zoom:1}.btn-capsule:active{box-shadow:none}.btn-capsule .btn-icon{font-size:.93em}.btn.accent{color:var(--buttonAccentText);border:1px solid transparent;background:var(--buttonAccentBackground)}.btn.accent:not(.outline):hover{color:var(--buttonAccentHoverText);background:var(--buttonAccentHoverBackground)}.btn.accent.outline{color:var(--buttonAccentBackground);border-color:var(--buttonAccentBackground);box-shadow:none}.btn.accent.outline:hover{color:var(--buttonAccentHoverBackground);border-color:var(--buttonAccentHoverBackground)}.btn.default{color:var(--buttonDefaultText);border-color:var(--buttonDefaultBorder);background:var(--buttonDefaultBackground)}.btn.default--hover:not(.outline),.btn.default:not(.outline):hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder)}.btn.default.outline{color:var(--buttonDefaultBackground);border-color:var(--buttonDefaultBackground);box-shadow:none}.btn.default.outline:hover{color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBackground)}.btn.disabled,.btn.disabled:hover{color:var(--bodyTextSubtle);background-color:var(--buttonDefaultBackground);background-image:none;box-shadow:none;cursor:default}.btn.disabled.outline,.btn.disabled.outline:hover{color:var(--bodyTextSubtle);border-color:var(--bodyTextSubtle)}.btn.plain,.btn.plain:hover{background:0 0;text-shadow:none;border-color:transparent;box-shadow:none;padding:0;color:inherit}.btn.plain:active{box-shadow:none}.btn.active{background-image:none;background-color:var(--colorAccent);border-color:var(--colorAccent);-webkit-filter:none;filter:none}.btn.grey,.btn.grey.off:hover{background-color:#eee}.btn.grey:hover{background-color:#e9e9e9}.btn.grey.outline{color:#eee}.btn.orange,.btn.orange.off:hover{border-color:#fe771d;background-color:#fe771d}.btn.orange:hover{background-color:#fe6b0a}.btn.orange.outline{color:#fe771d}.btn.purple,.btn.purple.off:hover{border-color:#8e44ad;background-color:#8e44ad}.btn.purple:hover{background-color:#8e44ad}.btn.purple.outline{color:#8e44ad}.btn.blue,.btn.blue.off:hover{border-color:var(--colorBlue);background-color:var(--colorBlue)}.btn.blue:hover{background-color:#2879b0}.btn.blue.outline{color:var(--colorBlue)}.btn.green,.btn.green.off:hover{background-color:var(--colorGreen)}.btn.green:not(.outline):hover{background-color:var(--colorGreenHover)}.btn.green.outline{color:var(--colorGreen);border-color:var(--colorGreenHover)}.btn.red,.btn.red.off:hover{border-color:var(--colorRed);background-color:var(--colorRed)}.btn.red:not(.outline):hover{background-color:var(--colorRedHover)}.btn.red.outline{color:var(--colorRed)}.btn.red.outline:hover{color:var(--colorRedHover);border-color:var(--colorRedHover)}.btn.white,.btn.white.off:hover{border-color:#fff;background-color:#fff}.btn.white:hover{background-color:#fff}.btn.white.outline{color:#fff}.btn.black,.btn.black.off:hover{border-color:#3a3a3a;background-color:#3a3a3a}.btn.black:hover{background-color:#343434}.btn.black.outline{color:#3a3a3a}.btn.active,.btn.black,.btn.blue,.btn.green,.btn.orange,.btn.red{color:#fff;border:1px solid transparent}.btn.grey,.btn.white{color:#161c1d}.btn.off{cursor:default}.btn.off:active{box-shadow:none}.btn-social{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);background-image:none;box-shadow:none;border:1px solid transparent}.btn-social.btn-at .btn-icon,.btn-social.btn-share .btn-icon{color:var(--buttonDefaultText)}.btn-social,.btn-social:hover{text-decoration:none;text-shadow:none}.btn-x-twitter,.link-x-twitter span{background:#000}.btn-twitter,.link-twitter span{background:#55acee}.btn-facebook,.link-facebook span{background:#3b5998}.btn-google,.btn-google-plus,.link-google span,.link-google-plus span{background:#d74836}.btn-mail{background:#ccc;color:var(--bodyText)}.btn-mail span{color:var(--bodyText)}.btn-tumblr{background:#35465c}.btn-pinterest{background:#bd081c}.btn-stumbleupon{background:#eb4924}.btn-blogger{background:#f57d00}.btn-whatsapp{background:#43d854}.btn-telegram{background:#08c}.btn-weixin{background:#7bb32e}.btn-weibo{background:#df2029}.btn-qzone{background:#ffce00}.btn-qq{background:#121214}.btn-reddit{background:#ff4500}.btn-reddit .btn-icon{color:#fff}.btn-vk,.link-vk span{background:#45668e}.btn.outline,.btn.outline:hover{background:0 0;border:1px solid;box-shadow:none}.pop-btn,.top-btn-el,a[data-modal]{-webkit-tap-highlight-color:transparent}.pop-btn *,.top-btn-el *{-webkit-tap-highlight-color:rgba(0,0,0,.2)}.pop-btn,.top-btn-el{display:inline-block;position:relative;cursor:pointer}.pop-box-inner{cursor:default;display:block;-webkit-overflow-scrolling:touch;overflow:auto}.pop-box-inner form{margin-top:-20px;margin-bottom:-20px}.btn.pop-btn .pop-box{line-height:100%}.pop-btn-text{color:var(--linkText);cursor:pointer}.ie7 .pop-btn-text,.ie8 .pop-btn-text{-webkit-padding-end:0;padding-inline-end:0}.pop-btn-text .arrow-down{vertical-align:middle;-webkit-margin-start:5px;margin-inline-start:5px;border-top-color:var(--linkText)}.pop-btn.disabled{cursor:default}.pop-btn.disabled .pop-btn-text{color:var(--bodyTextDisabled);cursor:default}.pop-btn.disabled .arrow-down{border-top-color:var(--bodyTextDisabled)}.pop-box{color:var(--menuText);background:var(--menuBackground);-webkit-backdrop-filter:blur(27.5px) saturate(1.8);backdrop-filter:blur(27.5px) saturate(1.8);display:none;font-size:1em;z-index:200;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid var(--menuBorder)}.phablet .pop-box,.phone .pop-box{font-size:inherit;border-color:transparent}.pop-box .or-separator{border-top-color:var(--menuSeparator);margin-left:10px;margin-right:10px}.phablet .pop-box .or-separator,.phone .pop-box .or-separator{border-top-color:var(--topBarText);opacity:.25}@media (min-width:992px){.pop-box{position:absolute;top:20px;min-height:20px;min-width:190px;box-shadow:0 4px 14px rgba(0,0,0,.25);border-radius:6px;box-sizing:content-box;--columnGutter:5px;--columnWidth:190px;--columnWidthOuter:calc(var(--columnWidth) + var(--columnGutter))}.header--height .pop-box{min-width:240px}.pop-box,.pop-box.left-anchor{inset-inline-start:0}.pop-box.anchor-center{inset-inline-start:50%!important}.pop-box.anchor-right{inset-inline-start:auto;inset-inline-end:0}.pop-box.pbcols2{width:calc(2 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols3{width:calc(3 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols4{width:calc(4 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols5{width:calc(5 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols2 li,.pop-box.pbcols3 li,.pop-box.pbcols4 li,.pop-box.pbcols5 li{border-radius:6px}.pop-box-menucols ul{padding:10px 0;overflow:auto}.pop-box-menucols li{width:var(--columnWidth);float:left;margin:0 0 0 5px}[dir=rtl] .pop-box-menucols li{float:right}.pop-box-menucols li:first-child a,.pop-box-menucols li:last-child a{border-radius:0}}.pop-box-menu{font-size:13px;font-size:.92857143rem;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.phablet .pop-box-menu,.phone .pop-box-menu{font-size:inherit}.pop-box-label{color:inherit;margin:10px;text-transform:uppercase;font-weight:700;font-size:85%;cursor:default}.pop-box-block{padding:0 10px}.pop-box-block .current::before{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-end:.25em;margin-inline-end:.25em;content:"\f205";font-size:90%}.pop-box-menu .menu-item,.pop-box-menu a{display:block;padding:6px 10px;text-decoration:none;font-weight:400;line-height:143%;color:var(--menuItemText)}.pop-box-block a{display:inline-block;padding:6px;border-radius:.25em;line-height:1;font-size:1em}.phablet .pop-box,.phone .pop-box{color:var(--topBarText)}.phablet .pop-box-menu .menu-item,.phablet .pop-box-menu a,.phone .pop-box-menu .menu-item,.phone .pop-box-menu a{padding:10px;color:inherit}.phablet .pop-box-menu li.with-icon a .btn-icon,.phone .pop-box-menu li.with-icon a .btn-icon{top:11px}@media (min-width:992px){.pop-box-menu .menu-item,.pop-box-menu a{border-bottom:0}}.pop-box-menu a.focus,html:not(.phone) .pop-box-menu a:hover{background:var(--menuItemHoverBackground);color:var(--menuItemHoverText)}.pop-box-menu li.current a,.pop-box-menu li.current a:hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground)}.pop-box-menu ul{display:block;padding:0}.phablet .pop-box-menu ul,.phone .pop-box-menu ul{display:flex;flex-wrap:wrap}.phablet .pop-box-menu ul li,.phone .pop-box-menu ul li{width:50%}@media (min-width:992px){.pop-box-menu ul{margin:5px 0}}.pop-box-menu li{display:block;text-align:start;overflow:hidden;position:relative}.pop-box-menu li.with-icon a{-webkit-padding-start:36px;padding-inline-start:36px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}html:not(.phone):not(.phablet) .header--height .pop-box-menu li a{-webkit-padding-end:25px;padding-inline-end:25px}.pop-box-menu li a kbd{position:absolute;top:50%;transform:translateY(-50%);inset-inline-end:10px;border-radius:2px;display:block;line-height:1;font-size:.9em;opacity:.5}.pop-box-menu li a:hover kbd{opacity:1}.phablet .pop-box-menu li a kbd,.phone .pop-box-menu li a kbd{display:none}.pop-box-menu li.with-icon a .btn-icon{position:absolute;inset-inline-start:10px;top:8px}.pop-box-menu li.current,.pop-box-menu li.current a{font-weight:600}.pop-box-menu li.current a:hover{cursor:default}.pop-box-userdetails{padding:10px;width:120%;min-width:var(--columnWidth);cursor:default;inset-inline-start:42px;line-height:normal;top:0!important;margin-top:0!important}.phablet .pop-box,.phone .pop-box{position:fixed;bottom:0;inset-inline-start:0!important;width:100%;top:auto!important;background:var(--topBarBackground);color:var(--topBarText)}@media all and (display-mode:standalone){.phablet .pop-box,.phone .pop-box{padding-bottom:30px}}.pop-box-header{font-weight:700;padding:15px 10px;position:relative;text-align:start;color:var(--topBarText)}.pop-box-header .icon--close{position:absolute;inset-inline-end:10px;top:50%;margin-top:-7px;font-size:1em;text-align:end}@media (min-width:992px){.pop-box-header{display:none}}.top-bar-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar,.top-bar ul li.pop-btn,.top-bar ul li.top-btn-el,.top-bar-placeholder{height:50px}.top-btn-create-account,.top-btn-text{line-height:50px}.top-btn-text{-webkit-tap-highlight-color:transparent}.follow-scroll{transition:all .4s ease-out}.scroll-down #dashboard .top-sub-bar--1{top:50px}#dashboard .top-sub-bar--1:not(.follow-scroll){position:static}.top-bar,.top-sub-bar{left:0;right:0;width:100%;position:static;height:50px}.follow-scroll,.top-bar{position:-webkit-sticky;position:sticky}.top-bar{color:var(--topBarText);z-index:900;top:0}.top-bar--main{z-index:910}.top-bar--main .content-width{padding-left:5px;padding-right:5px}.top-sub-bar{color:var(--bodyText);z-index:500;overflow:visible;top:50px}body.pop-box-show .top-sub-bar--1{z-index:1}.top-sub-bar--1 .content-tabs-container{z-index:2}body.landing .top-bar,body.split .top-bar{position:fixed}.phablet .pop-box-show .top-bar,.phone .pop-box-show .top-bar{z-index:1}.follow-scroll-wrapper.position-fixed,.top-bar::before,.top-sub-bar::before{background:var(--topBarBackground);-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px)}.top-sub-bar::before{background:var(--topSubBarBackground)}.top-bar::before,.top-sub-bar::before{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar::before,.top-sub-bar::before{width:100%;min-height:50px;position:absolute;content:" "}.top-bar .content-width,.top-sub-bar .content-width{position:relative;height:100%;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.top-bar-logo{width:100%;height:100%;position:absolute;top:0;text-align:center;inset-inline-start:0}.top-bar-logo img{height:20px}.top-bar-logo>a{display:inline-block;vertical-align:top;position:relative;top:50%;transform:translateY(-50%);text-decoration:none;font-weight:400;font-size:24px;color:var(--topBarText)}.top-bar-logo img{display:block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.top-bar ul{list-style:none}.top-bar li.pop-btn,.top-bar li.top-btn-el{float:left;-webkit-padding-end:5px;padding-inline-end:5px;-webkit-padding-start:5px;padding-inline-start:5px;position:relative}[dir=rtl] .top-bar li.pop-btn,[dir=rtl] .top-bar li.top-btn-el{float:right}@media (min-width:992px){.top-bar li.pop-btn,.top-bar li.top-btn-el{-webkit-padding-end:10px;padding-inline-end:10px;-webkit-padding-start:10px;padding-inline-start:10px}.top-bar .top-bar-notifications.pop-btn{-webkit-padding-end:0;padding-inline-end:0}}.top-bar ul .pop-btn.current,.top-bar ul .top-btn-el.current{border-bottom:3px solid var(--colorAccent)}.top-bar ul .pop-btn.current .top-btn-text,.top-bar ul .top-btn-el.current .top-btn-text{text-shadow:none;box-shadow:none}.top-bar ul li.top-btn-el a{text-decoration:none;color:inherit}.phablet .top-bar-left,.phone .top-bar-left{-webkit-margin-start:-5px;margin-inline-start:-5px}.phablet .top-bar-right,.phone .top-bar-right{-webkit-margin-end:-5px;margin-inline-end:-5px}.top-btn-el.current[data-nav=mobile-menu]{border-bottom-color:transparent!important}.top-btn-el.current[data-nav=mobile-menu] .top-btn-text .icon:before{color:var(--topBarText)!important;content:"\f00d"}.top-bar-right li.pop-btn:last-child,.top-bar-right li.pop-btn:last-child .arrow-down{-webkit-margin-end:0;margin-inline-end:0}.top-btn-create-account,.top-btn-text{display:block;font-weight:400;font-size:1em;height:100%}#menu-fullscreen .btn.top-btn-create-account,.btn.top-btn-create-account:not(.grey):not(.white),.top-btn-text{color:inherit}.top-btn-text{text-decoration:none;color:var(--topBarText)}.top-bar #menu-fullscreen .top-btn-text{color:var(--topBarText)}body.landing .top-btn-text{color:var(--topBarText)}.top-btn-text .icon{-webkit-margin-end:7px;margin-inline-end:7px;position:relative;top:0;display:inline-block;font-size:18px;width:18px;font-size:1.28571429rem;width:1.625rem;line-height:50px;text-align:center}.current .top-btn-text .icon{color:var(--colorAccent)}.top-btn-text .btn-text{-webkit-margin-start:0;margin-inline-start:0}.top-btn-text .arrow-down{position:relative;margin:0 0 0 5px}.top-btn-text .btn-text{vertical-align:top}.top-btn-text .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen .top-bar-notifications .btn-text{display:inline-block}#menu-fullscreen #top-bar-user,#menu-fullscreen [data-nav=upload]{display:none}.top-bar-notifications-container{-webkit-margin-end:2px;margin-inline-end:2px;cursor:default}.top-bar-notifications-header{font-size:.93em;line-height:1;padding:12px 10px;overflow:auto}.top-bar-notifications-header,.top-bar-notifications-list li{border-bottom:1px solid var(--menuSeparator)}.top-bar-notifications-header h2{font-size:1em;font-weight:700;float:left}[dir=rtl] .top-bar-notifications-header h2{float:right}.top-bar-notifications-header a{float:right}[dir=rtl] .top-bar-notifications-header a{float:left}.top-bar-notifications-list li{display:block;text-decoration:none;padding:10px;position:relative;min-height:68px;-webkit-padding-start:68px;padding-inline-start:68px}.top-bar-notifications-list li:last-child{border-bottom:0}.top-bar-notifications-list li:hover{background:rgba(0,0,0,.02)}.top-bar-notifications-list li.transition{transition:background-color 150ms linear}.top-bar-notifications-list li.new,.top-bar-notifications-list li.persistent{background:#fffad9}.ie7 .top-bar-notifications-list li{min-height:48px}.top-bar-notifications-list li .user-image{width:48px;height:48px;position:absolute;left:10px;top:10px}.top-bar-notifications-list li .user-image img{width:100%;height:100%;display:block}.top-bar-notifications-list li .user-image span.icon{font-size:48px;width:48px;height:48px;-webkit-margin-start:-24px;margin-inline-start:-24px;margin-top:-24px}.top-bar-notifications-list li .how-long-ago{display:block;font-size:11px;color:var(--bodyTextSubtle)}.top-bar-notifications .top-btn-number{position:absolute;z-index:1;border-radius:100px;zoom:.75;inset-inline-end:-8px;top:10px;visibility:hidden}.top-bar-notifications .top-btn-number.on{visibility:visible}@media (min-width:992px){.top-bar .pop-box{margin:10px;z-index:200}}.top-bar-search-input .icon--close{inset-inline-end:-4px}.top-bar-search-input .icon--settings{inset-inline-end:14px}.top-bar .top-bar-search-input .icon--search{color:var(--colorAccent)}.top-bar-search-input{display:flex;justify-content:center;align-items:center}.top-bar-search-input .input-search{position:relative}.top-bar-search-input input{font-size:1em;border-width:0;-webkit-padding-start:36px;padding-inline-start:36px}.tone-light .top-bar .top-bar-search-input input{border-width:1px}.top-bar-left .pop-box{inset-inline-start:-10px}.top-bar-right .pop-box{inset-inline-start:auto;inset-inline-end:-10px}.top-bar--main .pop-box{top:calc(50% + 10px)}#top-predictive-search.pop-box{width:200px;inset-inline-start:0;font-size:100%}.top-bar .pop-account .or-separator{margin-top:30px;margin-bottom:30px}.top-btn-create-account{text-decoration:none;display:inline;padding:4px 12px;height:26px}.top-bar .opened .top-btn-text span:not(.btn-text),.top-bar .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.phone .top-bar .top-btn-text:hover span:not(.btn-text){color:inherit}.phone .top-bar .current .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.ios .top-bar .top-btn-text span:not(.btn-text):not(.top-btn-number):hover{color:var(--bodyText)}.ios .top-bar .opened .top-btn-text span:not(.btn-text),.ios .top-bar .opened .top-btn-text:not(.top-btn-number){color:var(--colorAccent)}.top-bar .btn:hover:not(.white):not(.grey),.top-bar .btn:not(.white):not(.grey),.top-bar .opened .btn:not(.white):not(.grey){color:#fff}.current .top-btn-create-account:hover{background:inherit}.current .top-btn-create-account{padding:0;background:0 0}.top-btn-number{background:#555;color:#ddd;font-size:12px;font-weight:400;border-radius:3px;padding:0 7px;position:relative;display:block;line-height:22px;height:22px;top:-2px}#menu-fullscreen .top-btn-number{display:inline-block;position:absolute;-webkit-margin-end:5px;margin-inline-end:5px;top:10px;vertical-align:text-bottom;inset-inline-start:30px;inset-inline-end:auto}.opened .top-btn-number.on,.tone-light.ios .top-bar .top-btn-number.on,.tone-light.top-bar .top-btn-number.on,.top-bar .top-btn-text:hover .top-btn-number.on,.top-btn-number.on,.top-btn-number.on:hover{background:#d90000;color:#fff}.pop-account .pop-box-inner{padding:20px 10px;cursor:default}.pop-account .title,.pop-account h2{font-size:1em;text-align:center;margin-top:5px;font-weight:400;display:block}.pop-account .sign-services{margin:15px 0 11px 0}.pop-account input.text-input,.pop-account input[type=password],.pop-account input[type=text]{width:100%}.ie7 .pop-account input.text-input{width:266px;height:auto}.pop-account .checkbox-label{display:inline-block;margin:0}#top-bar-user .top-btn-text .user-image{position:relative;top:50%;margin-top:-13px;width:1em;height:1em;float:left;font-size:26px;background:0 0;color:inherit;-webkit-margin-end:0;margin-inline-end:0}[dir=rtl] #top-bar-user .top-btn-text .user-image{float:right}#top-bar-user-menu.pop-box{width:150px}.header{position:relative}.header-icon{color:var(--colorAccent)}.header-tabs{min-height:50px}.header.follow-scroll{-webkit-margin-end:-10px;margin-inline-end:-10px;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;overflow:visible;position:-webkit-sticky;position:sticky;min-height:50px}.header.fixed.follow-scroll{border-bottom:0}.header .header-title,.header h1{font-size:1em}.header>*{vertical-align:middle}.header .header-title,.header .heading,.header .heading *,.header>h1{word-break:break-word}.header-tabs .heading,.header-tabs .heading *,.header-tabs>.header-title,.header-tabs>h1{line-height:50px}.header .header-title,.header .heading,.header>h1{font-size:1.57142857rem;font-weight:400;display:inline-block;color:inherit}.header .header-title a,.header h1 a{color:inherit;text-decoration:none}.header .header-title strong,.header .heading strong,.header h1 strong{font-weight:inherit}.header.header-tabs .header-title,.header.header-tabs h1{-webkit-margin-end:5px;margin-inline-end:5px}.header ul.content-tabs{display:inline-block}.phablet .header ul.content-tabs,.phone .header ul.content-tabs{float:none;display:inline-block;inset-inline-start:10px;inset-inline-end:10px;position:absolute;z-index:1;white-space:nowrap}.phablet .header.follow-scroll ul.content-tabs,.phone .header.follow-scroll ul.content-tabs{position:absolute;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phablet .header:not(.follow-scroll) ul.content-tabs,.phone .header:not(.follow-scroll) ul.content-tabs{top:auto}.header-content-left{float:left}[dir=rtl] .header-content-left{float:right}.header-content-right{float:right;height:auto;-webkit-margin-start:auto;margin-inline-start:auto}[dir=rtl] .header-content-right{float:left}@media (max-width:340px){.header-content-right.breaks-ui{clear:both;position:static!important;-webkit-margin-start:0;margin-inline-start:0}}.phablet .header-content-right:not(.phablet-float-none),.phone .header-content-right:not(.phone-float-none){position:absolute;inset-inline-end:0;top:0;float:right}[dir=rtl].phablet .header-content-right:not(.phablet-float-none),[dir=rtl].phone .header-content-right:not(.phone-float-none){float:left}.header-content-right .number-figures{margin-top:14px;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator)}.header-content-right .number-figures:first-child{-webkit-border-start:0;border-inline-start:0}.header .header-link{font-size:1em;display:inline-block}.header .pop-btn.breadcrum-item{margin-top:0}.header .user-image{font-size:30px;width:1em;height:1em;margin-top:10px;float:left}[dir=rtl] .header .user-image{float:right}.header.header-content{position:relative;min-height:40px;border:0}.header.header-content .heading,.header.header-content .heading *{line-height:40px;height:40px}.header-content img{max-height:40px}.header-content .user-image{width:1em;height:1em;font-size:40px;margin-top:0;top:0}.header .user-image img,.header-content .user-image img{width:100%;height:100%;display:block}.header-description{line-height:1.4;max-height:10vh;overflow-y:scroll;overflow:auto}.header-description:empty{display:none}.header-description p{margin:10px 0}.header-content-breadcrum{float:left}[dir=rtl] .header-content-breadcrum{float:right}.breadcrum-item :not(.btn){line-height:normal}.breadcrum-text,.header-content-breadcrum .breadcrum-item{line-height:40px}.breadcrum-text,.breadcrum-text a{color:inherit}.breadcrum-text{font-weight:400}.breadcrum-item{-webkit-margin-end:5px;margin-inline-end:5px;position:relative;float:left}[dir=rtl] .breadcrum-item{float:right}.breadcrum-text a:hover{color:var(--linkText);text-decoration:none}.breadcrum-text .user-link{-webkit-margin-start:5px;margin-inline-start:5px}.header-content-breadcrum .arrow,.header-content-breadcrum .arrow-down,.header-content-breadcrum .arrow-right{-webkit-margin-start:5px;margin-inline-start:5px;position:relative}.header-content-breadcrum a:hover .arrow-down{border-top-color:var(--linkText)}.header-content-breadcrum a:hover .arrow-right{border-left-color:var(--linkText)}.header-content-breadcrum .pop-box h2{font-size:1.07em;line-height:1.2}.header-content-breadcrum .pop-box h2 a{line-height:1}.btn-container [dir=rtl] .header-content .btn{float:right}.header-content .btn:last-child{-webkit-margin-end:0;margin-inline-end:0}.follow-scroll{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;z-index:1}.follow-scroll-wrapper{left:0;right:0;z-index:50}.follow-scroll-wrapper.position-fixed .header{margin-bottom:-1px!important}.follow-scroll-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.phablet .header:not(.header-tabs) .tab-menu,.phone .header:not(.header-tabs) .tab-menu{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);border-radius:4px;height:auto;line-height:1em;min-height:1em;padding:10px}.phablet .header:not(.header-tabs) .tab-menu:not(.--hide),.phone .header:not(.header-tabs) .tab-menu:not(.--hide){color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);margin-bottom:10px}.phablet .header .tab-menu.--hide .tab-menu--show,.phablet .header .tab-menu:not(.--hide) .tab-menu--hide,.phone .header .tab-menu.--hide .tab-menu--show,.phone .header .tab-menu:not(.--hide) .tab-menu--hide{display:none}.tab-menu--hide,.tab-menu--show{-webkit-margin-start:2.5px;margin-inline-start:2.5px}.tab-menu{cursor:pointer;line-height:50px;min-height:50px}.tab-menu.--hide .btn-icon[data-content=tab-icon]{color:var(--colorAccent)}.tab-menu.--hide{color:var(--buttonDefaultText)}.tab-menu:not(.--hide){color:var(--buttonDefaultHoverText)}.content-tabs-container{position:relative;display:inline-block}.phablet .content-tabs-container--mobile,.phone .content-tabs-container--mobile{box-shadow:0 6px 4px rgba(0,0,0,.25);inset-inline-start:-10px;width:100%;width:100dvw}.phablet .content-tabs-wrap,.phone .content-tabs-wrap{height:50px;overflow-y:hidden;position:relative;-webkit-overflow-scrolling:touch;overflow-x:scroll;position:relative;display:none;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground);padding-left:10px;padding-right:10px}.content-tabs-wrap::-webkit-scrollbar{display:none}.content-tabs-wrap{display:inline-block;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.content-tabs li{scroll-snap-align:start}.content-tabs li:not(.current){transition-duration:.2s;transition-property:background-color}.content-tabs a{font-weight:400;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phone .content-tabs li:last-child{-webkit-margin-end:15px;margin-inline-end:15px}.content-tabs-shade{content:" ";background:-webkit-linear-gradient(0deg,rgba(255,255,255,0),var(--bodyBackground));width:15px;height:100%;position:absolute;inset-inline-end:0;top:0;pointer-events:none;z-index:2}[dir=rtl] .content-tabs-shade{background:-webkit-linear-gradient(180deg,rgba(255,255,255,0),var(--bodyBackground))}.phablet .content-tabs a,.phone .content-tabs a{color:var(--menuItemText)}.content-tabs li.disabled a{cursor:default}.tab-menu .--show{display:none}.tab-menu.current .--show{display:inline-block}.tab-menu.current .--hide{display:none}.content-tabs li{float:left;font-size:1em}[dir=rtl] .content-tabs li{float:right}.phablet .content-tabs li,.phone .content-tabs li{float:none;border-bottom:0;display:inline-block}.content-tabs-vertical li{float:none;margin:0;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent}.content-tabs-vertical li>*{-webkit-padding-end:20px;padding-inline-end:20px;-webkit-padding-start:20px;padding-inline-start:20px}.header-content-right .content-tabs li{-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.content-tabs a,.content-tabs li,.content-tabs-wrap{height:50px;line-height:50px;display:block;border:0}.content-tabs-vertical a,.content-tabs-vertical li{height:38px;line-height:38px}.content-tabs li.current,.content-tabs li.visited,.content-tabs li.visited:hover{border-color:var(--colorAccent);border-style:solid;border-bottom-width:3px}.content-tabs li.current .btn-icon{color:var(--colorAccent)}.content-tabs li:not(.current):hover{background:var(--bodyEmpty)}.content-tabs li:not(.current):hover a .btn-icon{color:var(--colorAccent)}.content-tabs li.disabled:hover{border-bottom:0}.content-tabs li.current{border-color:var(--colorAccent)}.content-tabs li.visited{border-bottom-color:transparent}.content-tabs li.current.visited{border-color:#d93600}.content-tabs li.visited,.content-tabs li.visited a{color:#d93600}.content-tabs-vertical li.current,.content-tabs-vertical li:hover{border-bottom-width:0;border-left-width:2px}.content-tabs .tab-count{font-weight:400;color:var(--bodyTextSubtle)}.content-tabs .tab-count-block{font-weight:400;background:#d90000;border-radius:3px;padding:1px 4px;position:relative;top:-1px}.content-tabs .current .tab-count-block,.content-tabs .tab-count-block{color:#fff}.content-tabs li.disabled *{color:var(--bodyTextDisabled)}.header--centering{display:flex;align-items:center;flex-wrap:wrap}.header--height{overflow:visible;height:50px}.list-selection *{line-height:normal}#tabbed-content-group{margin-top:20px;padding-bottom:20px;position:relative}.content-listing .viewer-kb{opacity:0;position:fixed;bottom:-100px;z-index:1;left:0;right:0;background:linear-gradient(0deg,var(--topBarBackground) 0,rgba(0,0,0,0) 100%)}.--has-selection .content-listing.visible .viewer-kb{opacity:1;bottom:0}.content-listing .viewer-kb-input{color:var(--menuText);background:var(--menuBackground);border-radius:.5em;margin:1em;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);box-shadow:0 4px 14px rgb(0 0 0 / 25%)}#content-listing-tabs #tabbed-content-group{margin-top:0}#content-listing-tabs{padding-bottom:0;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-margin-end:-10px;margin-inline-end:-10px}.tabbed-content{display:none;width:100%;overflow:hidden}.title{font-size:.93em;font-weight:700;margin-bottom:5px}.title.grid-columns{-webkit-margin-end:10px;margin-inline-end:10px;text-align:end;line-height:2}.phablet .title.grid-columns,.phone .title.grid-columns{-webkit-margin-end:0!important;margin-inline-end:0!important;text-align:start}.tabbed-content-section{overflow:auto}.tabbed-content-list{line-height:1.8}.tabbed-listing .tabbed-content{overflow:hidden}.table-li{display:table;width:100%}.table-li>li{padding-top:8px;padding-bottom:8px;border-bottom:1px solid var(--bodySeparator);list-style:none!important}.tabbed-content-list.table-li-hover>li:hover{background:var(--bodyEmpty)}.tabbed-content-list .table-li-header{font-weight:700}.tabbed-content-list.table-li-hover .table-li-header:hover{background:0 0}.table-li ul li:last-child{border-bottom:none}.desktop .table-li--mobile-display,.laptop .table-li--mobile-display,.largescreen .table-li--mobile-display,.phablet .table-li--mobile-display,.tablet .table-li--mobile-display{display:none!important}.viewer-title{flex-grow:1;order:2;font-size:1.57142857rem;line-height:1.43em;-webkit-padding-end:2em;padding-inline-end:2em}.panel-description:empty{display:none;margin:0!important;padding:0!important}.panel-description .description-text{font-size:1em;line-height:1.6em}.panel-description .description-meta{font-size:.93em}.panel-description .exif-meta{-webkit-padding-start:1.57em;padding-inline-start:1.57em;position:relative}.panel-description .exif-meta .camera-icon{color:var(--bodyTextDisabled);position:absolute;inset-inline-start:0;top:.21em;font-size:1.14em}.panel-description .exif-meta .exif-data{display:block;font-size:1em}.panel-thumbs{z-index:1;bottom:0;left:0;right:0;background:var(--viewerBackground)}.panel-thumb-list{overflow-x:auto;overflow-y:hidden;white-space:nowrap;text-align:center;height:50px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.panel-thumb-list:empty{display:none}.panel-thumb-list li{position:relative;font-size:0;border-top:3px solid transparent;display:inline-block;line-height:50px}.panel-thumb-list li.current{border-color:var(--colorAccent)}.list-item-desc .panel-thumb-list li:hover img,.panel-thumb-list li.current img{opacity:1}.phablet .panel-thumb-list li.more-link,.phone .panel-thumb-list li.more-link{clear:both;line-height:100%;padding:10px 0}.panel-thumb-list img{display:block;width:47px;height:47px;opacity:.4;transition:opacity 350ms ease}.panel-thumb-list li:hover img{opacity:1}.panel-share-item{margin-bottom:30px}.panel-share-item:last-child{margin-bottom:0}.panel-share-item .pre-title{-webkit-padding-start:200px;padding-inline-start:200px;line-height:20px;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--bodySeparator);font-weight:700}.phablet .panel-share-item .pre-title,.phone .panel-share-item .pre-title{-webkit-padding-start:0;padding-inline-start:0}.panel-share-item .title{line-height:36px;-webkit-margin-after:0;margin-block-end:0}.panel-share-item .grid-columns{position:relative}.panel-share-input-label{margin-bottom:10px;overflow:auto}.panel-share-input-label:last-child{margin-bottom:0}.panel-share-input{position:relative}.panel-share-networks{overflow:auto;text-align:center}.panel-share-networks h4.title{line-height:32px}.panel-share-networks li{display:inline-block;-webkit-margin-end:5px;margin-inline-end:5px;margin-bottom:5px}.panel-share-networks li a{display:block;width:32px;height:32px;position:relative}.panel-report h4.title{line-height:36px}.text-content{font-size:16px}.text-content li,.text-content p{line-height:160%;margin:10px 0}.text-content h1,.text-content h2,.text-content h3,.text-content h4{margin:40px 0 20px 0;font-weight:400;line-height:120%}.text-content h1{font-size:1.375em}.text-content h2{font-size:1.25em}.text-content h3{font-size:1.125em}.text-content h4{font-size:1.07em}.text-content h5{font-size:1em}.text-content h6{font-size:1em}.text-content ol,.text-content ul{-webkit-margin-start:20px;margin-inline-start:20px}.text-content li{list-style:disc outside;margin-top:0;margin-bottom:0}.form-content{position:relative;margin-top:20px}.form-content .input-label:first-child{margin-top:0}.signup-services-column h2{font-size:17px}.signup-services-column ul{margin:10px 0}.signup-services-column li:first-child{-webkit-margin-start:0;margin-inline-start:0}.signup-services-column li:last-child{-webkit-margin-end:0;margin-inline-end:0}.form-content .content-tabs-vertical{-webkit-margin-end:10px;margin-inline-end:10px;position:absolute;inset-inline-start:0;top:0}.form-content .content-tabs-vertical.position-fixed{position:fixed;inset-inline-start:auto;top:auto}.tabbed-input-column{-webkit-margin-start:200px;margin-inline-start:200px}.phablet .tabbed-input-column,.phone .tabbed-input-column{-webkit-margin-start:0;margin-inline-start:0}.account-link{position:relative}a.account-linked-profile{width:48px;height:48px;display:block}a.account-linked-profile img{width:100%;height:100%;display:block;border:0}.text-overflow-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}html.menu-fullscreen-visible{overflow:hidden}#menu-fullscreen{position:fixed;left:0;top:50px;bottom:0;right:0;height:calc(100vh - 50px);height:calc(100dvh - 50px);width:100vw;width:100dvw;overflow:auto}#menu-fullscreen .menu-hide{display:none}#menu-fullscreen .fullscreen{top:50px;height:calc(100% - 50px)}#menu-fullscreen>ul>li{display:block;float:none;border-bottom:0;margin:0!important;position:relative}#menu-fullscreen>ul>li .top-btn-text{padding:0 5px;background:inherit}#menu-fullscreen>ul>li .icon{-webkit-margin-end:7px;margin-inline-end:7px}#menu-fullscreen>ul>li .input-search .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen>ul>li a{text-decoration:none}#menu-fullscreen .input-search{-webkit-margin-start:5px;margin-inline-start:5px;top:10px;width:auto}#menu-fullscreen .input-search .search{border-radius:0;-webkit-padding-end:50px;padding-inline-end:50px;-webkit-padding-end:3.12rem;padding-inline-end:3.12rem}#menu-fullscreen .menu-fullscreen-show{display:block}#menu-fullscreen .menu-fullscreen-hide{display:none}body.upload-box-visible{margin-top:300px}body.upload-box-visible.no-margin-top{margin-top:280px}body.upload-box-visible .upload-box{display:block}.upload-box{clear:both;background:var(--bodyBackground)}.upload-box--fixed{position:fixed;left:0;right:0;z-index:200;background:var(--bodyBackground)}body:not(#upload) .upload-box--fixed{padding-top:50px;overflow:auto}.phone .upload-box--fixed{top:0;z-index:500;max-height:100%;overflow-y:auto;overflow-x:hidden}.upload-box--hidden{transform:translateY(-100%);top:-1px}.upload-box--show{transform:translateY(0)}.upload-box-inner{padding:40px 0;position:relative}.phone .upload-box-inner{padding:20px 0}.upload-box-inner .position-absolute{position:absolute;text-transform:uppercase;top:20px;line-height:20px}#upload .upload-box[data-queue-size="0"] .upload-box-heading,.phone .upload-box[data-queue-size="0"] .upload-box-heading{position:fixed;top:50%;left:0;right:0;transform:translateY(-50%);padding:10px}.upload-box-heading{text-align:center}.upload-box-heading .icon{font-size:100px;height:1em;display:inline-block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;text-decoration:none;-webkit-tap-highlight-color:transparent}.upload-box-heading .heading,.upload-box-heading h2{font-size:26px;margin:10px 0;display:block}.upload-box-heading .heading a,.upload-box-heading h2 a{color:inherit;text-decoration:none}.upload-box-status a{display:inline-block}.upload-box-status-text{font-size:1em;line-height:1.4}.upload-box-allowed-files{inset-inline-start:0;font-size:11px;font-size:.79rem;color:var(--bodyTextSubtle)}.upload-box-close{text-decoration:none;inset-inline-end:0;font-size:11px;line-height:11px;font-size:.79rem;line-height:1em;color:var(--bodyText)}.upload-box-close:hover{text-decoration:none}.upload-box-close a{color:inherit;text-decoration:none}.upload-box-close .btn-icon{font-size:.9em;display:inline}@media (min-width:380px){.upload-input-col{width:350px}}.page-not-found{border-radius:10px;background:var(--bodyEmpty);text-align:center;padding:30px;font-size:16px;margin-top:20px}.page-not-found h1{font-size:30px;margin-bottom:10px}.page-not-found .input-search{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:20px}.page-not-found .input-search .icon--search{font-size:20px;inset-inline-start:14px;top:8px}.page-not-found .input-search .icon--close{top:3px;inset-inline-end:6px}.page-not-found input.search{height:36px;width:100%;font-size:15px;-webkit-padding-end:30px;padding-inline-end:30px;-webkit-padding-start:40px;padding-inline-start:40px}.ie7 .page-not-found input.search,.ie8 .page-not-found input.search,.ie9 .page-not-found input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:36px}.content-listing{overflow:hidden;position:relative;clear:both}.pad-content-listing{width:calc(100% + 10px);-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:relative}.list-item{display:inline-block;position:relative}.js .content-listing{opacity:0}.js .jsly.content-listing{opacity:1}.list-item .disabled-mask{width:100%;height:100%;position:absolute;top:0;inset-inline-start:0;background:rgba(255,255,255,.5);z-index:1}.list-item:hover .hover-display,.phablet .list-item .hover-display,.phone .list-item .hover-display{display:block}.list-item.masked:hover .hover-display{display:none}.list-item .hover-display,html.--idle .list-item .hover-display:not(.idle-display),html.--idle .list-item-image-tools>div{opacity:0;transition:all 350ms ease}html:not(.--idle) .list-item:hover .hover-display{opacity:1}.phablet .list-item .hover-display,.phone .list-item .hover-display{opacity:1;transition:none}.list-item-image{position:relative;display:block;overflow:hidden;min-height:260px;text-align:center;background:var(--bodyEmpty);content-visibility:auto;contain:layout style paint}.list-item-image .image-container{display:inline-block;text-align:center;vertical-align:bottom;text-decoration:none;font-size:64px;width:100%;height:100%}.js .list-item-image .image-container.--media{width:100%;height:100%}.list-item-image .image-container .media,.list-item-image .image-container img,.list-item-image .image-container svg,.list-item-image .image-container video{display:block;position:relative;width:100%!important;height:100%;-o-object-fit:cover;object-fit:cover}.list-item-image .image-container .icon.empty{font-size:1em;opacity:.25}.list-item-image .image-container .empty{color:var(--bodyText);text-decoration:none}.selected .list-item-image .image-container .icon.empty,.ui-selecting .list-item-image .image-container .icon.empty{color:#fff}.list-item-image-btn{padding:5px 8px 5px 28px;font-size:.93em;background:var(--bodyBackground);position:absolute;top:10px;cursor:pointer;border-radius:2px}.list-item-image-btn.list-image-like-btn{inset-inline-start:10px}.list-item-image-btn span{font-size:15px;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.ie7 .list-item-image-btn span{inset-inline-start:4px;top:2px}.list-item-image-btn:hover span{color:var(--colorAccent)}.list-item-image-btn.liked{background:var(--colorAccent);color:#fff;display:block}.list-item-image-btn.liked:hover{background:#d90000}.list-item-image-btn.liked:hover span.icon-like{font-size:11px;padding:0;inset-inline-start:10px;color:#fff;margin-top:-6px}.list-item-image-btn.liked:hover span.icon-like:before{content:"\e01f"}.list-item-desc-title{width:100%;height:100%;padding:0 10px;inset-inline-start:0;bottom:10px;text-decoration:none}.list-item-desc-title>*{padding-bottom:5px;margin-bottom:-2.5px;-webkit-padding-start:5px;padding-inline-start:5px;-webkit-margin-start:-5px;margin-inline-start:-5px}.list-item-from{bottom:0;line-height:1}.phablet .content-listing:not([data-list=users]).list-item-desc-title,.phone .content-listing:not([data-list=users]).list-item-desc-title{display:none}.list-item-desc-title--center-y{top:50%;transform:translateY(-50%)}.list-item-desc-title-link{font-size:1.1em;font-weight:600;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:calc(100%)}@media (min-width:320px){.list-item-desc-title-link{width:calc(100% - 20px)}}.list-item-title{padding-top:0;padding-bottom:0;font-weight:400;text-align:center;height:40px;overflow:hidden}.list-item-title,.list-item-title *{font-size:1em;line-height:40px}.list-item-title a{font-weight:400;color:var(--bodyText)}.list-item-alt{background:#f9f9f9}.list-item-desc-height{height:100%}.list-item-overflow{height:110%;overflow:hidden}.list-item-desc{width:100%;font-size:.93em;line-height:1;box-shadow:0 1px 0 rgba(0,0,0,.1),0 0 0 transparent;border-bottom:1px solid rgba(0,0,0,.2)}.list-item-desc a,.list-item-desc b,.list-item-desc strong,.list-item.masked:hover .list-item-desc a,.list-item.masked:hover .list-item-title a{color:inherit}.list-item:hover .list-item-desc a,.list-item:hover .list-item-title a{color:var(--linkText)}.list-item-desc .user,.list-item-desc a.user img{border-radius:100%}.list-item-desc .user{float:left;margin-top:-20px;-webkit-margin-end:8px;margin-inline-end:8px;padding:3px;background:var(--bodyBackground);width:50px;height:50px}[dir=rtl] .list-item-desc .user{float:right}.list-item-desc .user:hover{background:var(--linkText)}.phablet .content-listing[data-list=images] .list-item-desc,.phone .content-listing[data-list=images] .list-item-desc{display:none}.list-item-desc strong{display:block}.list-item-card{border-radius:3px;min-height:82px}.list-item-card .user-image{display:block}.list-item-thumbs-container{overflow:hidden}.list-item-thumbs{overflow:auto;background:#f9f9f9;width:101%;margin-top:2px;margin-bottom:0;-webkit-margin-start:-1px;margin-inline-start:-1px}.list-item-thumbs li{background:#f6f6f6;-webkit-border-end:1px solid;border-inline-end:1px solid;-webkit-border-start:1px solid;border-inline-start:1px solid;border-color:#fff;float:left}[dir=rtl] .list-item-thumbs li{float:right}.list-item-desc{color:inherit;background:0 0;border:0;box-shadow:none;text-shadow:1px 1px 5px rgba(0,0,0,.5);opacity:0;transition:all 350ms ease;bottom:5px;position:absolute}.desktop .list-item .list-item-desc,.laptop .list-item .list-item-desc,.largescreen .list-item .list-item-desc,.list-item:hover .list-item-desc,.phablet .list-item .list-item-desc,.phone .list-item .list-item-desc,.tablet .list-item .list-item-desc{opacity:1}.list-item-desc *,.list-item-desc a,.list-item:hover .list-item-desc a{color:var(--listItemText)}.list-item-desc .list-item-overflow{bottom:0;inset-inline-start:0;padding:10px;position:absolute;height:auto}.content-listing-loading,.content-listing-more{text-align:center;margin:20px 0}.content-listing-more{display:none}.content-listing-loading{height:32px}.content-listing-loading .loading-indicator{position:static}.content-listing-pagination{text-align:center;font-size:1.3em;padding:0;color:inherit;font-weight:400;margin-top:20px}.js .content-listing-pagination{display:none}.content-listing-pagination.visible{display:flex!important}.content-listing-pagination a{text-decoration:none;font-weight:inherit;color:inherit;padding:.3em 1em;display:inline-block;border-radius:4px}.content-listing-pagination li.pagination-prev{text-align:end}.content-listing-pagination li.pagination-next{text-align:start}.content-listing-pagination a:hover{color:var(--linkText);background:var(--bodyEmpty)}.content-listing-pagination a.current{color:inherit}.phone .content-listing-pagination li.pagination-page{display:none}.content-listing-pagination li,.phone .content-listing-pagination li.pagination-page.pagination-current{display:inline-block}.content-listing-pagination li.pagination-next,.content-listing-pagination li.pagination-prev{flex-grow:4}.content-listing-pagination li.pagination-current{flex-grow:1}.content-listing-pagination .pagination-current a,.content-listing-pagination .pagination-current a:hover{color:inherit;background:initial;cursor:default}.pagination-disabled{visibility:hidden}.content-empty{padding:4em 2em;text-align:center;font-size:inherit;color:var(--bodyTextSubtle)}.content-empty .icon{color:var(--bodyTextSubtle);font-size:90px;width:90px;height:90px;display:inline-block}.content-empty .message,.content-empty h2{font-size:16px;margin-top:10px;line-height:160%}.sort-listing{display:none}.sort-listing .selection-count:before{content:" (";white-space:pre}.sort-listing .selection-count:after{content:")"}.disabled.sort-listing .selection-count:after,.disabled.sort-listing .selection-count:before{display:none}.user-image{display:inline-block}.user-image path{fill:red}.user-image,.user-image img{display:block}.default-user-image{color:var(--bodyText);text-align:center;position:relative;border-radius:100%;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground)}.checkered-background{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.1) 75%),linear-gradient(135deg,transparent 75%,rgba(0,0,0,.1) 75%);background-size:25px 25px;background-position:0 0,12.5px 0,12.5px -12.5px,0 12.5px}.default-user-image .icon{color:inherit;position:absolute;inset-inline-start:50%;top:50%;display:block;line-height:100%;font-size:1em;width:1em;height:1em;-webkit-margin-start:-.5em;margin-inline-start:-.5em;margin-top:-.5em}.default-user-image.size-70,img.user-image.size-70{width:70px;height:70px}.default-user-image.size-70 .icon{font-size:38px;-webkit-margin-start:-19px;margin-inline-start:-19px;margin-top:-19px}.default-user-image.size-60,img.user-image.size-60{width:60px;height:60px}.default-user-image.size-60 .icon{font-size:32px;-webkit-margin-start:-16px;margin-inline-start:-16px;margin-top:-16px}.default-user-image.size-40,img.user-image.size-40{width:40px;height:40px}.default-user-image.size-40 .icon{font-size:22px;-webkit-margin-start:-11px;margin-inline-start:-11px;margin-top:-11px}.user-social-networks{font-size:1em;margin-bottom:5px}.user-social-networks,.user-social-networks a{text-decoration:none;color:var(--bodyTextSubtle)}.user-social-networks a{padding:2px}.user-social-networks a:hover{color:var(--bodyText)}.top-user{position:relative;height:110px;margin-top:10px;margin-bottom:10px;height:auto;min-height:100px}.top-user.no-background{min-height:160px}.top-user>div{position:absolute;top:0}.top-user .top-user-credentials{position:static;-webkit-padding-end:220px;padding-inline-end:220px;clear:both;overflow:visible}.top-user.user-has-no-background .top-user-credentials{overflow:auto}.phone .top-user .top-user-credentials{-webkit-padding-end:0;padding-inline-end:0;-webkit-padding-start:0;padding-inline-start:0;width:100%;margin-bottom:10px;text-align:center;margin-top:-160px}.top-user-avatar{font-size:160px;z-index:500}a.top-user-avatar{display:block}.phone .top-user-avatar{position:relative}.top-user-avatar{position:absolute;left:0}.phablet .top-user:not(.no-background) .top-user-avatar,.tablet .top-user:not(.no-background) .top-user-avatar{top:calc(-.4em - 10px)}.top-user{-webkit-padding-start:190px;padding-inline-start:190px}.desktop .top-user:not(.no-background),.laptop .top-user:not(.no-background),.largescreen .top-user:not(.no-background),.phone .top-user{-webkit-padding-start:0;padding-inline-start:0}.desktop .top-user:not(.no-background) .top-user-avatar,.laptop .top-user:not(.no-background) .top-user-avatar,.largescreen .top-user:not(.no-background) .top-user-avatar{position:absolute;left:50%;-webkit-margin-start:calc(-.5em - 10px);margin-inline-start:calc(-.5em - 10px);top:calc(-.5em - 10px)}.phablet .top-user .user-image,.tablet .top-user .user-image{border:0;-webkit-margin-end:10px;margin-inline-end:10px}.top-user .user-image{font-size:1em;width:1em;height:1em;float:left}.header .user-image img,.header-content .user-image img,.top-user .user-image,.user-image,.user-image img{border-radius:50%;object-fit:cover}.top-user:not(.no-background) .user-image{border:10px solid var(--bodyBackground)}.top-user:not(.no-background) img.user-image{background:var(--bodyBackground);border:10px solid transparent;box-sizing:content-box}.phone .top-user.no-background .top-user-credentials{margin-top:initial}.phone .top-user .top-user-credentials>a{display:inline-block}.top-user .header-content-right{inset-inline-end:0}.top-user .header-content-right>*{margin-bottom:10px}.top-user .header-content-right>:last-child{margin-bottom:0}.phone .top-user .header-content-right{position:relative}.phone .top-user .header-content-right>div{margin:10px auto;text-align:center}.phone .top-user .input-search{position:relative;top:auto}.phone .top-user .input-search form{position:relative}.top-user h1{font-size:1.8575em;font-weight:700;margin-bottom:5px;margin-top:10px;color:var(--bodyText)}.no-margin-top .top-user h1,.phone .top-user h1{margin-top:0}.top-user h1 a{color:inherit;text-decoration:none}.top-user .user-meta{margin-bottom:5px}.user-meta .icon--lock{-webkit-margin-end:5px;margin-inline-end:5px}[dir=rtl] .top-user .user-image{float:right}.phone .top-user .user-image{float:none;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-bottom:10px}.phone body.no-margin-top .top-user .user-image{margin-top:10px}.top-user .user-image.no-border{border:none}.top-user .number-figures{margin-top:0}.user-card.avatar{-webkit-padding-start:70px;padding-inline-start:70px}.user-card.no-avatar{-webkit-padding-start:0;padding-inline-start:0}.user-card .or-separator{margin-top:5px;margin-bottom:5px}.user-card .user-link{font-size:.93em}.user-card-header h2{font-size:15px;font-weight:400;margin-top:0;margin-bottom:2px}.user-card-header h2 a{color:inherit;text-decoration:none}.user-card-header div{color:var(--bodyTextSubtle)}.user-card-footer{overflow:hidden}.user-card-footer .user-social-networks{margin-top:3px}.top-user .input-search .icon--close{right:.5rem;top:50%;transform:translate(0,-50%)}.ad-space{text-align:center}.ad-margin-vertical{margin-top:20px;margin-bottom:20px}.ad-margin-horizontal{-webkit-margin-start:20px;margin-inline-start:20px;-webkit-margin-end:20px;margin-inline-end:20px}[role=menu]{position:relative;overflow:visible}.menu-box,[role=menu]>.menu-box{z-index:300}[role=menu]>.menu-box{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-height:10px;display:block;visibility:hidden;transition:350ms all ease-in-out;opacity:0;transform:translateY(-5px);transform-origin:top;max-height:100vh;max-height:100dvh}[role=menu].opened>.menu-box{visibility:visible;opacity:1;transform:translateY(0)}@media (min-width:768px){[role=menu]>.menu-box{transition:none}}.menu-box{border:0}.menu-box,.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{background:var(--bodyBackground);border-radius:3px;box-shadow:0 0 15px 0 rgba(0,0,0,.2);color:var(--bodyText);font-size:14px;font-weight:400;position:absolute;top:100%;list-style:none;min-width:190px;padding:0;margin:0}.menu-box--static{position:static;max-width:190px}.menu-box :not(a),.menu-box [role*=button]{color:var(--bodyText)}.menu-box ul{margin:0;padding:0}.float-left .menu-box,.pull-left .menu-box,menu-box.anchor-left{inset-inline-start:0}.float-right .menu-box,.menu-box--anchor-right,.pull-right .menu-box{inset-inline-end:0}.menu-box .separator,.menu-box [role=separator],.menu-box hr{display:block;margin:0;padding:0;height:0;border:0;border-top:1px solid #ebebeb}.menu-box--border-separators>*{border-bottom:1px solid #ebebeb}.menu-box--border-separators>:last-child{border-bottom:0}.menu-box--border-separators>hr{display:none}.menu-box .sub,.menu-box [role*=button],.menu-box [role=box],.menu-box li{padding:10px;list-style:none;position:relative;line-height:1.4;clear:both;min-height:40px;display:block}.menu-box [role=box]{cursor:default}.menu-box [role*=button]{-webkit-padding-start:35px;padding-inline-start:35px;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-align:start}.menu-box--multiline [role*=button]{white-space:normal}.menu-box--noicons li:not([role=button]){-webkit-padding-start:0;padding-inline-start:0}.menu-box--noicons [role=button]{-webkit-padding-start:10px;padding-inline-start:10px;color:inherit}.menu-box [role=button]:hover{border-left-color:#a66bbe}.menu-box .disabled[role=button]{cursor:not-allowed;background:0 0;border-color:transparent!important;opacity:.5}.menu-box li.menu-box-sub{-webkit-padding-end:34px;padding-inline-end:34px}.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{display:none}.menu-box .menu-box-sub:hover>.sub,.menu-box .menu-box-sub:hover>ul{display:block}.menu-box [role*=button]>.icon,.menu-box li>.icon{font-size:16px;width:16px;height:16px;text-align:center;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.menu-box .menu-box-sub>.icon{inset-inline-start:auto;inset-inline-end:10px}.menu-box .menu-box-sub .sub,.menu-box .menu-box-sub ul{cursor:default;position:absolute;top:0;inset-inline-start:100%}.menu-box .meta{font-size:.93em;display:block}.menu-box .empty{font-size:1em;text-align:center;padding:40px 20px}.menu-box .empty>.icon{font-size:64px;margin-bottom:10px;display:block;color:#ebebeb;position:static}.arrow-navigator a{color:var(--colorAccent);display:block;text-decoration:none;text-align:center;height:40px;width:40px;position:absolute;top:50%;margin-top:-20px;opacity:.7;padding:10px}.arrow-navigator a.disabled{display:none}.arrow-navigator a:hover{opacity:1}.arrow-navigator a span{display:inline-block;font-size:20px;width:1em;height:1em;text-align:center}.growl{word-break:break-word;color:var(--alertText);font-size:1.1em;line-height:1.2;background:var(--alertBackground);padding:1em;-webkit-padding-end:2em;padding-inline-end:2em;text-align:center;overflow:visible;position:fixed;width:630px;inset-inline-start:50%;top:45px;z-index:9999;cursor:default;-webkit-border-start:5px solid var(--alertAccent);border-inline-start:5px solid var(--alertAccent);box-shadow:0 0 15px 5px rgba(0,0,0,.15);border-radius:4px;-webkit-margin-start:-315px;margin-inline-start:-315px}.growl:empty{display:none}.phone .growl{left:10px;right:10px;width:auto;-webkit-margin-start:auto;margin-inline-start:auto}.growl.static{-webkit-margin-start:auto;margin-inline-start:auto;position:static;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:30px;padding-inline-end:30px;box-shadow:none;z-index:initial;margin:auto;width:auto}.growl.static.inline{margin:initial;text-align:start;display:inline-block;-webkit-padding-end:1em;padding-inline-end:1em;-webkit-padding-start:1em;padding-inline-start:1em}.growl .icon{font-size:14px;text-align:center;position:absolute;inset-inline-end:5px;top:7px;cursor:pointer;padding:10px;color:var(--alertText)}.growl-debug-message{text-align:start}.growl-debug-trace{overflow-x:auto;font-size:80%;margin-top:10px}.growl-debug-status{font-style:italic;margin-top:10px;margin-bottom:10px}#growl-placeholder{position:relative}#fullscreen-modal-box #growl-placeholder .growl{overflow:auto;text-align:start}.flex-center{margin:auto}.width-full{width:100%}.height-full{height:100%}.width-min-full{min-width:100%}.height-min-full{min-height:100%}.fullscreen{position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;overflow:auto;z-index:1000;opacity:0;transition:opacity 350ms linear}.fullscreen.black,.fullscreen.white{-webkit-backdrop-filter:blur(35px) saturate(1.8);backdrop-filter:blur(35px) saturate(1.8)}.black-bkg,.fullscreen.black{background:var(--backgroundDarkAlpha)}.fullscreen.white,.white-bkg{background:var(--backgroundLightAlpha)}.fullscreen.soft-white,.soft-white-bkg{background:rgba(255,255,255,.6)}.ie9 .fullscreen{-webkit-filter:none;filter:none}.fullscreen-loader{width:150px;height:150px;text-align:center;border-radius:10px;color:#fff;margin-top:-75px;-webkit-margin-start:-75px;margin-inline-start:-75px;position:absolute;top:50%;inset-inline-start:50%;zoom:1}.loading-txt{position:absolute;bottom:15px;inset-inline-start:0;text-align:center;width:100%}#fullscreen-modal{display:none}#fullscreen-modal.--show{display:grid;align-items:center}.ie9 #fullscreen-modal{-webkit-filter:none;filter:none}#fullscreen-modal-box{width:670px;margin:0 auto;padding:20px;position:relative;box-shadow:0 0 50px 6px rgba(0,0,0,.25);border-radius:10px;background:var(--modalBackground);color:var(--modalText)}.--has-scrollbar #fullscreen-modal-box{border-radius:0}.phone #fullscreen-modal-box{width:100%;margin:0;max-height:100%;-webkit-overflow-scrolling:touch;border-radius:0;padding:20px}#fullscreen-modal-box .modal-box-title,#fullscreen-modal-box h1{display:block;margin-top:0;margin-bottom:20px;font-size:20px;line-height:1.2;-webkit-padding-end:32px;padding-inline-end:32px}#fullscreen-modal-box h2{font-size:1.14em}#fullscreen-modal-box h2 *{font-weight:400}#fullscreen-modal-box .or-separator{margin-top:16px}#fullscreen-modal-box p{font-size:1em;line-height:160%;margin-top:10px;margin-bottom:10px}#fullscreen-modal-box p:firt-child{margin-top:0}#fullscreen-modal-box .btn-container{margin-bottom:0}#fullscreen-modal-box .close-modal.icon--close{position:absolute;inset-inline-end:10px;top:15px;cursor:pointer;display:block;padding:10px}.phone #fullscreen-modal-box .close-modal.icon--close,.phone #fullscreen-modal-box .close-modal.icon--close:hover{inset-inline-end:10px}.modal-form textarea{height:70px;resize:none}.fancy-box{padding:20px;background:var(--bodyBackground);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);border-radius:10px}.fancy-box p{-webkit-margin-before:1em;margin-block-start:1em;-webkit-margin-after:1em;margin-block-end:1em}.fancy-box .or-separator{height:1px;margin:0}#fullscreen-changes-confirm{background:var(--bodyBackground);padding:40px 0;margin-top:75px;position:absolute;text-align:center;top:50%;width:100%;box-shadow:0 4px 16px rgba(0,0,0,.25)}#fullscreen-changes-confirm h2{font-size:18px;line-height:18px;color:inherit}.fullscreen-viewer{background:#000;background:rgba(0,0,0,.9);color:#bbb;display:none}.fullscreen-viewer-top{height:50px;width:100%;background:#000}.fullscreen-viewer-navigation,.fullscreen-viewer-top-user{margin-top:8px}.fullscreen-viewer-top-user img{width:34px;height:34px;-webkit-margin-end:10px;margin-inline-end:10px}.fullscreen-viewer-navigation{font-size:16px;font-size:1.143rem;height:26px;position:relative;z-index:100}.fullscreen-viewer-navigation a{display:inline-block;color:#bbb;color:rgba(255,255,255,.7);text-decoration:none;padding:8px}.fullscreen-viewer-navigation a:hover{color:#fff}.fullscreen-viewer-navigation a.disabled{color:#bbb;color:rgba(255,255,255,.4);cursor:default}.fullscreen-viewer-content{text-align:center;height:100%;position:relative;display:none}.fullscreen-viewer-content img{max-width:100%;max-height:100%;box-shadow:0 0 6px 0 #000}#cookie-law-banner{position:fixed;padding:20px;width:100%;bottom:0;background:rgba(0,0,0,.8);color:#fff;font-size:1.2em;z-index:1000}#cookie-law-banner p{font-size:85%;-webkit-padding-end:20px;padding-inline-end:20px}a.cookie-law-close{color:inherit;text-decoration:none;position:absolute;inset-inline-end:0;top:0;opacity:.5}a.cookie-law-close:hover{opacity:1}.badge--paid{text-transform:uppercase;text-align:center;border-radius:3px;padding:2px 5px;display:inline-block;line-height:1;border:1px solid var(--buttonDefaultBorder);color:var(--buttonDefaultHoverText);background-color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder);font-weight:400}.pop-box-menu li .badge{position:absolute;inset-inline-end:8px;top:8px}.badge{vertical-align:text-bottom;font-size:.7143em;transform-origin:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.badge+label,.btn .badge{-webkit-margin-start:5px;margin-inline-start:5px}.pop-box-menu li.paid a{-webkit-padding-end:52px;padding-inline-end:52px}.r1{height:30px}.r2{height:70px}.r3{height:110px}.r4{height:150px}.r5{height:190px}.r6{height:230px}.r7{height:270px}.r8{height:310px}.r9{height:350px}.r10{height:390px}.r11{height:430px}.r12{height:470px}.r13{height:510px}.r14{height:550px}.r15{height:590px}.r16{height:630px}.r17{height:670px}.r18{height:710px}.r19{height:750px}.r20{height:790px}.r11{height:830px}.r22{height:870px}.r23{height:910px}.r24{height:950px}.columns-container{overflow:auto}.grid-columns{display:block;float:left}[dir=rtl] .grid-columns{float:right}.gutter-margin-right,.gutter-margin-right-bottom{-webkit-margin-end:1px;margin-inline-end:1px}.gutter-margin-bottom,.gutter-margin-left-bottom,.gutter-margin-right-bottom{margin-bottom:1px}.gutter-margin-left,.gutter-margin-left-bottom{-webkit-margin-start:1px;margin-inline-start:1px}.gutter-width{width:5px}.col-1-min{min-width:30px}.col-2-min{min-width:70px}.col-3-min{min-width:110px}.col-4-min{min-width:150px}.col-5-min{min-width:190px}.col-6-min{min-width:230px}.col-7-min{min-width:270px}.col-8-min{min-width:310px}.col-9-min{min-width:350px}.col-10-min{min-width:390px}.col-11-min{min-width:430px}.col-12-min{min-width:470px}.col-13-min{min-width:510px}.col-14-min{min-width:550px}.col-15-min{min-width:590px}.col-16-min{min-width:630px}.col-17-min{min-width:670px}.col-18-min{min-width:710px}.col-19-min{min-width:750px}.col-20-min{min-width:790px}.col-21-min{min-width:830px}.col-22-min{min-width:870px}.col-23-min{min-width:910px}.col-24-min{min-width:950px}.col-1-max{max-width:30px}.col-2-max{max-width:70px}.col-3-max{max-width:110px}.col-4-max{max-width:150px}.col-5-max{max-width:190px}.col-6-max{max-width:230px}.col-7-max{max-width:270px}.col-8-max{max-width:310px}.col-9-max{max-width:350px}.col-10-max{max-width:390px}.col-11-max{max-width:430px}.col-12-max{max-width:470px}.col-13-max{max-width:510px}.col-14-max{max-width:550px}.col-15-max{max-width:590px}.col-16-max{max-width:630px}.col-17-max{max-width:670px}.col-18-max{max-width:710px}.col-19-max{max-width:750px}.col-20-max{max-width:790px}.col-21-max{max-width:830px}.col-22-max{max-width:870px}.col-23-max{max-width:910px}.col-24-max{max-width:950px}@media (min-width:768px){.c1{width:30px}.c2{width:70px}.c3{width:110px}.c4{width:150px}.c5{width:190px}.c6{width:230px}.c7{width:270px}.c8{width:310px}.c9{width:350px}.c10{width:390px}.c11{width:430px}.c12{width:470px}.c13{width:510px}.c14{width:550px}.c15{width:590px}.c16{width:630px}.c17{width:670px}.c18{width:710px}.fluid-column.c1{width:3.157%}.fluid-column.c2{width:7.368%}.fluid-column.c3{width:11.578%}.fluid-column.c4{width:15.789%}.fluid-column.c5{width:20%}.fluid-column.c6{width:24.21%}.fluid-column.c7{width:28.421%}.fluid-column.c8{width:32.631%}.fluid-column.c9{width:36.842%}.fluid-column.c10{width:41.052%}.fluid-column.c11{width:45.263%}.fluid-column.c12{width:49.473%}.fluid-column.c13{width:53.684%}.fluid-column.c14{width:57.894%}.fluid-column.c15{width:62.105%}.fluid-column.c16{width:66.315%}.fluid-column.c17{width:70.526%}.fluid-column.c18{width:74.736%}}@media (min-width:992px){.content-width{width:100%;min-width:970px}.c19{width:750px}.c20{width:790px}.c21{width:830px}.c22{width:870px}.c23{width:910px}.c24{width:950px}.fluid-column.c19{width:78.947%}.fluid-column.c20{width:83.157%}.fluid-column.c21{width:87.368%}.fluid-column.c22{width:91.578%}.fluid-column.c23{width:95.789%}.fluid-column.c24{width:100%}.top-btn-text .btn-text{-webkit-margin-start:7px;margin-inline-start:7px}.pop-box .arrow-down{border-width:6px 6px 0 6px}}@media (min-width:992px) and (max-width:1920px){.content-width{max-width:1800px}}@media (min-width:1921px) and (max-width:2560px){.content-width{max-width:2440px}}@media (min-width:3840px){.content-width{max-width:3720px}}.color-body-text-subtle{color:var(--bodyTextSubtle)}.color-accent{color:var(--colorAccent)}.color-success{color:var(--colorSuccess)}.color-fail{color:var(--colorFail)}.color-white{color:#fff!important}.color-black{color:#333!important}.color-grey{color:#ccc!important}.color-green{color:#27ae61!important}.color-red{color:#e74c3c!important}.color-blue{color:var(--colorBlue)!important}.color-orange{color:#d35400!important}.color-purple{color:#8e44ad!important}.color-inherit{color:inherit!important}.color-initial{color:initial!important}.height-auto{height:auto}.width-auto{width:auto}.height-100p{height:100%}.width-100p{width:100%}.color-facebook{color:#3b5998}.color-twitter{color:#1da1f2}.color-google{color:#ea4335}.color-vk{color:#45668e}.border-color-facebook{border-color:#3b5998}.border-color-twitter{border-color:#1da1f2}.border-color-google{border-color:#ea4335}.border-color-vk{border-color:#45668e}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.background-black{background:#000!important}.background-white{background:#fff!important}.background-transparent{background:0 0!important}.background-gradient-white-left{background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,1) 35%,rgba(255,255,255,1) 100%)}.background-gradient-white-right{background:linear-gradient(to right,rgba(255,255,255,1) 0,rgba(255,255,255,1) 80%,rgba(255,255,255,0) 100%)}.font-weight-bold{font-weight:700!important}.font-weight-normal{font-weight:400!important}.cursor-pointer{cursor:pointer!important}.cursor-grab{cursor:-webkit-grab;cursor:grab}.cursor-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.cursor-default{cursor:default!important}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.font-size-small{font-size:13px;font-size:.92857143rem!important}.font-size-medium{font-size:medium!important}.font-size-large{font-size:large!important}.font-size-inherit{font-size:inherit!important}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.height-100p{height:100%!important}.height-120p{height:120%!important}.top-0{top:0}.top-10{top:10px}.top-20{top:20px}.top-30{top:30px}.top-40{top:40px}.right-0{inset-inline-end:0}.right-10{inset-inline-end:10px}.right-20{inset-inline-end:20px}.right-30{inset-inline-end:30px}.right-40{inset-inline-end:40px}.bottom-0{bottom:0}.bottom-10{bottom:10px}.bottom-20{bottom:20px}.bottom-30{bottom:30px}.bottom-40{bottom:40px}.left-0{inset-inline-start:0}.left-10{inset-inline-start:10px}.left-20{inset-inline-start:20px}.left-30{inset-inline-start:30px}.left-40{inset-inline-start:40px}.display-none{display:none}.display-none-forced{display:none!important}.display-block{display:block}.display-block-forced{display:block!important}.display-flex{display:-moz-flex;display:flex}.visibility-hidden{visibility:hidden}.clear-both{clear:both}.float-left{float:left}[dir=rtl] .float-left{float:right}.float-right{float:right}[dir=rtl] .float-right{float:left}.border-0,.no-border{border:none}.border-top-0{border-top:0}.border-right-0{-webkit-border-end:0;border-inline-end:0}.border-bottom-0{border-bottom:0}.border-left-0{-webkit-border-start:0;border-inline-start:0}.box-shadow-none{box-shadow:none}.word-break-break-all{word-break:break-all}.word-break-break-word{word-break:break-word}.margin-0{margin:0!important}.phone .phone-margin-0{margin:0!important}.margin-5{margin:5px!important}.margin-10{margin:10px!important}.margin-20{margin:20px!important}.margin-30{margin:20px!important}.margin-40{margin:20px!important}.margin-top-0,.phablet .phablet-margin-top-0,.phone .phone-margin-top-0{margin-top:0!important}.margin-top-5,.phablet .phablet-margin-top-5,.phone .phone-margin-top-5{margin-top:5px!important}.margin-top-10,.phablet .phablet-margin-top-10,.phone .phone-margin-top-10{margin-top:10px!important}.margin-top-20,.phablet .phablet-margin-top-20,.phone .phone-margin-top-20{margin-top:20px!important}.margin-top-30{margin-top:30px!important}.margin-top-40{margin-top:40px!important}.margin-right-auto{-webkit-margin-end:auto!important;margin-inline-end:auto!important}.margin-right-0,.phablet .phablet-margin-right-0,.phone .phone-margin-right-0{-webkit-margin-end:0!important;margin-inline-end:0!important}.margin-right-035em{-webkit-margin-end:.35em!important;margin-inline-end:.35em!important}.margin-right-5{-webkit-margin-end:5px!important;margin-inline-end:5px!important}.margin-right-10{-webkit-margin-end:10px!important;margin-inline-end:10px!important}.margin-right-20{-webkit-margin-end:20px!important;margin-inline-end:20px!important}.margin-right-30{-webkit-margin-end:30px!important;margin-inline-end:30px!important}.margin-right-40{-webkit-margin-end:40px!important;margin-inline-end:40px!important}.margin-bottom-0,.phablet .phablet-margin-bottom-0,.phone .phone-margin-bottom-0{margin-bottom:0!important}.margin-bottom-5{margin-bottom:5px!important}.margin-bottom-10,.phablet .phablet-margin-bottom-10,.phone .phone-margin-bottom-10{margin-bottom:10px!important}.margin-bottom-20,.phablet .phablet-margin-bottom-20,.phone .phone-margin-bottom-20{margin-bottom:20px!important}.margin-bottom-30{margin-bottom:30px!important}.margin-bottom-40{margin-bottom:40px!important}.margin-left-auto{-webkit-margin-start:auto!important;margin-inline-start:auto!important}.margin-left-0,.phablet .phablet-margin-left-0,.phone .phone-margin-left-0{-webkit-margin-start:0!important;margin-inline-start:0!important}.margin-right--10{-webkit-margin-end:-10px!important;margin-inline-end:-10px!important}.margin-left--10{-webkit-margin-start:-10px!important;margin-inline-start:-10px!important}.margin-left-5{-webkit-margin-start:5px!important;margin-inline-start:5px!important}.margin-left-10{-webkit-margin-start:10px!important;margin-inline-start:10px!important}.margin-left-20{-webkit-margin-start:20px!important;margin-inline-start:20px!important}.margin-left-30{-webkit-margin-start:30px!important;margin-inline-start:30px!important}.margin-left-40{-webkit-margin-start:40px!important;margin-inline-start:40px!important}.padding-0{padding:0!important}.phone .phone-padding-0{padding:0!important}.padding-5{padding:5px!important}.padding-10{padding:10px!important}.padding-20{padding:20px!important}.padding-30{padding:20px!important}.padding-40{padding:20px!important}.padding-top-5{padding-top:5px!important}.padding-top-0{padding-top:0!important}.padding-top-10{padding-top:10px!important}.padding-top-20{padding-top:20px!important}.padding-top-30{padding-top:30px!important}.padding-top-40{padding-top:40px!important}.padding-right-5{-webkit-padding-end:5px!important;padding-inline-end:5px!important}.padding-right-0{-webkit-padding-end:0!important;padding-inline-end:0!important}.padding-right-10{-webkit-padding-end:10px!important;padding-inline-end:10px!important}.padding-right-20{-webkit-padding-end:20px!important;padding-inline-end:20px!important}.padding-right-30{-webkit-padding-end:30px!important;padding-inline-end:30px!important}.padding-right-40{-webkit-padding-end:40px!important;padding-inline-end:40px!important}.padding-bottom-5{padding-bottom:5px!important}.padding-bottom-0{padding-bottom:0!important}.padding-bottom-10{padding-bottom:10px!important}.padding-bottom-20{padding-bottom:20px!important}.padding-bottom-30{padding-bottom:30px!important}.padding-bottom-40{padding-bottom:40px!important}.padding-left-5{-webkit-padding-start:5px!important;padding-inline-start:5px!important}.padding-left-0{-webkit-padding-start:0!important;padding-inline-start:0!important}.padding-left-10{-webkit-padding-start:10px!important;padding-inline-start:10px!important}.padding-left-20{-webkit-padding-start:20px!important;padding-inline-start:20px!important}.padding-left-30{-webkit-padding-start:30px!important;padding-inline-start:30px!important}.padding-left-40{-webkit-padding-start:40px!important;padding-inline-start:40px!important}.position-sticky{position:-webkit-sticky;position:sticky}.position-static{position:static}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.text-align-left{text-align:start}.text-align-center{text-align:center}.text-align-right{text-align:end}.text-align-justify{text-align:justify}.text-decoration-none{text-decoration:none!important}.display-block{display:block}.display-inline{display:inline}.display-inline-table{display:inline-table}.display-inline-block{display:inline-block}.display-table-cell{display:table-cell}.word-break-break-all{word-break:break-all}.list-style-position-inside li{list-style-position:inside!important}.list-style-position-outside li{list-style-position:outside!important}.list-style-type-disc li{list-style-type:disc!important}.list-style-type-decimal li{list-style-type:decimal!important}.center-box{-webkit-margin-end:auto!important;margin-inline-end:auto!important;-webkit-margin-start:auto!important;margin-inline-start:auto!important}.display-inline-block,.display-table-cell{zoom:1}.vertical-align-middle{vertical-align:middle!important}.resize-vertical{resize:vertical!important}.no-resize,.resize-none{resize:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-y-visible{overflow-y:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-scroll{overflow-y:scroll!important}.text-transform-capitalize{text-transform:capitalize}.text-transform-uppercase{text-transform:uppercase}.default-margin-top{margin-top:20px}.default-margin-bottom{margin-bottom:20px}.float-none{float:none!important;clear:both!important}.desktop .desktop-hide,.laptop .laptop-hide,.largescreen .desktop-hide,.phablet .phablet-hide,.phone .phone-hide,.tablet .tablet-hide{display:none!important}.desktop .desktop-display-block,.desktop .desktop-show,.laptop .laptop-display-block,.laptop .laptop-show,.largescreen .desktop-display-block,.largescreen .desktop-show,.phablet .phablet-display-block,.phablet .phablet-show,.phone .phone-display-block,.phone .phone-show,.tablet .tablet-display-block,.tablet .tablet-show{display:block!important}.desktop .desktop-display-inline,.laptop .laptop-display-inline,.phablet .phablet-display-inline,.phone .phone-display-inline,.tablet .tablet-display-inline{display:inline!important}.desktop .desktop-display-inline-block,.laptop .laptop-display-inline-block,.phablet .phablet-display-inline-block,.phone .phone-display-inline-block,.tablet .tablet-display-inline-block{display:inline-block!important}.image-responsive{max-width:100%!important;width:auto!important}.desktop .desktop-float-none,.laptop .laptop-float-none,.phablet .phablet-float-none,.phone .phone-float-none,.tablet .tablet-float-none{float:none;clear:both}.phablet .grid-columns,.phone .grid-columns{float:none;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}.phablet .phablet-float-left,.phone .phone-float-left{float:left!important}[dir=rtl].phablet .phablet-float-left,[dir=rtl].phone .phone-float-left{float:right!important}.phablet .phablet-c1,.phone .fluid-column.phablet-c1,.phone .fluid-column.phone-c1,.phone .phone-c1{width:100%}.phablet .phablet-text-align-left,.phone .phone-text-align-left{text-align:left!important}.phablet .phablet-text-align-center,.phone .phone-text-align-center{text-align:center!important}#tiptip_holder{display:none;position:absolute;top:0;inset-inline-start:0;z-index:99999}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_right{-webkit-padding-start:5px;padding-inline-start:5px}#tiptip_holder.tip_left{-webkit-padding-end:5px;padding-inline-end:5px}#tiptip_content{font-size:12px;color:#fff;padding:6px 8px;background-color:#333;background-color:rgba(0,0,0,.8);word-break:break-word}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-top-color:#333;border-top-color:rgba(0,0,0,.8)}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-bottom-color:#333;border-bottom-color:rgba(0,0,0,.8)}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-right-color:#333;border-right-color:rgba(0,0,0,.8)}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-left-color:#333;border-left-color:rgba(0,0,0,.8)}.antiscroll-wrap{display:block;position:relative;overflow:hidden}.antiscroll-scrollbar{background:gray;background:rgba(0,0,0,.5);border-radius:7px;box-shadow:0 0 1px #fff;position:absolute;opacity:0;-webkit-transition:linear 350ms opacity;-moz-transition:linear 350ms opacity;-o-transition:linear 350ms opacity}.antiscroll-scrollbar-shown{opacity:1}.antiscroll-scrollbar-horizontal{height:7px;-webkit-margin-start:2px;margin-inline-start:2px;bottom:2px;inset-inline-start:0}.antiscroll-scrollbar-vertical{width:7px;margin-top:2px;inset-inline-end:2px;top:0}.antiscroll-inner{overflow:scroll}.antiscroll-inner::-webkit-scrollbar{width:0;height:0}.antiscroll-inner::scrollbar{width:0;height:0}#recaptcha_table.recaptcha_theme_clean #recaptcha_image{border:0!important}#recaptcha_response_field{height:auto}.copy-hover-display button.copy-input,.copy-hover-display button.input-action{visibility:hidden}.copy-hover-display:hover button.copy-input,.copy-hover-display:hover button.input-action,.phablet button.copy-input,.phablet button.input-action,.phone button.copy-input,.phone button.input-action{visibility:visible}button.copy-input,button.input-action{position:absolute;inset-inline-end:7px;top:.8181em;text-transform:uppercase;cursor:pointer;line-height:1;font-size:11px;padding:4px 6px;border-radius:4px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:0}button.copy-input,button.input-action{background:var(--buttonDefaultBackground);color:var(--buttonDefaultText)}button:hover.copy-input,button:hover.input-action{background:var(--buttonDefaultHoverBackground);color:var(--buttonDefaultHoverText)}.shake{-webkit-animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.key-feedback{line-height:1;background:rgba(0,0,0,.7);position:fixed;z-index:10000;-webkit-backdrop-filter:blur(30px);backdrop-filter:blur(30px);bottom:1.5em;transition:all .5s;opacity:0;text-align:center;color:#fff;font-weight:700;font-size:45px;padding:1em;border-radius:.5em;inset-inline-start:50%;transform:translateX(-50%);border:4px solid rgba(255,255,255,.9);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img.qr{display:inline-block}.fa-vkontakte:before{content:"\f189"}.fab.fa-mailru{font-family:"Font Awesome 5 Free";font-weight:900}.fa-mailru:before{content:"\f1fa"}.fa-stackexchange:before{content:"\f18d"}.fa-twitchtv:before{content:"\f1e8"}.fa-wechat:before{content:"\f1d7"}.clearfix:after{clear:both;display:table;content:''} \ No newline at end of file +:root{--colorBlue:rgb(0, 110, 219);--colorBlueHover:rgb(0, 119, 237);--colorGreen:#2ecc71;--colorGreenHover:#27ae60;--colorOrange:#e67e22;--colorOrangeHover:#d35400;--colorPurple:#9b59b6;--colorPurpleHover:#8e44ad;--colorRed:#e74c3c;--colorRedHover:#c0392b;--colorYellow:#f1c40f;--colorYellowHover:#f39c12}:root{color-scheme:light;--colorSuccess:var(--colorGreen);--colorFail:var(--colorRed);--alertAccent:#f1c40f;--alertBackground:#fff5b3;--alertText:#161c1d;--backgroundDarkAlpha:rgb(0 0 0 / 80%);--backgroundLightAlpha:rgb(255 255 255 / 90%);--bodyBackground:#FFF;--bodyEmpty:#e2e8e9;--bodySeparator:#e2e8e9;--bodyText:#161c1d;--bodyTextDisabled:#c5d1d3;--bodyTextSubtle:#6c7779;--buttonAccentBackground:var(--colorAccent);--buttonAccentHoverBackground:var(--colorAccentStrong);--buttonAccentHoverText:var(--buttonAccentText);--buttonAccentText:#FFF;--buttonDefaultBackground:#d9e1e2;--buttonDefaultBorder:var(--buttonDefaultBackground);--buttonDefaultHoverBackground:#c0def2;--buttonDefaultHoverBorder:var(--buttonDefaultHoverBackground);--buttonDefaultHoverText:var(--buttonAccentBackground);--buttonDefaultText:#161c1d;--colorAccent:var(--colorBlue);--colorAccentStrong:var(--colorBlueHover);--inputBackground:#ecf0f1;--inputPlaceholderText:#8aa2a8;--inputText:#161c1d;--linkText:rgb(0, 102, 204);--menuBackground:hsla(0, 5.9%, 98.9%, .7);--menuItemHoverBackground:var(--colorAccent);--menuItemHoverText:#FFF;--menuItemText:#161c1d;--menuSeparator:rgba(11, 14, 15, 0.1);--menuBorder:var(--menuSeparator);--menuText:#161c1d;--modalBackground:var(--bodyBackground);--modalText:#161c1d;--topBarBackground:rgb(255 255 255);--topSubBarBackground:var(--topBarBackground);--topBarText:#161c1d;--viewerBackground:#323232;--listItemText:#FFF}*{-ms-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.btn,.btn-container,.input-search,.link,.list-item,.no-select,.pop-btn-text,.top-btn-text,.user-select-none{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.animate{transition:all .2s ease-in-out}.animate--slow{transition-duration:.4s}[type=search]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}::-webkit-input-placeholder{color:var(--inputPlaceholderText);line-height:140%}:-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}::-moz-placeholder{color:var(--inputPlaceholderText);opacity:1}:-ms-input-placeholder{color:var(--inputPlaceholderText)}:focus::-webkit-input-placeholder{color:var(--inputPlaceholderText)}:focus:-moz-placeholder{color:var(--inputPlaceholderText)}:focus::-moz-placeholder{color:var(--inputPlaceholderText)}focus:-ms-input-placeholder{color:var(--inputPlaceholderText)}::-moz-focus-inner{border:0;padding:0;margin:0}::-ms-clear{display:none}body{min-height:100vh;min-height:100dvh;min-height:-webkit-fill-available;-webkit-font-smoothing:subpixel-antialiased}[type=submit]:focus,button:focus{outline:0}html{height:100%;height:-webkit-fill-available}body,html{min-height:100vh;min-height:100dvh;font-family:Helvetica,Arial,sans-serif;color:var(--bodyText);font-size:16px;background:var(--bodyBackground);-webkit-text-size-adjust:100%}kbd{font-family:inherit}.pointer-events-none{pointer-events:none}#menu-fullscreen,#pop-box-mask.fullscreen{height:100%}#menu-fullscreen,.pop-box{transition:transform 350ms cubic-bezier(.4,0,0,1),opacity 350ms cubic-bezier(.4,0,0,1)}#menu-fullscreen>ul{position:relative;z-index:1000;background:var(--topBarBackground);color:var(--topBarText)}body.no-margin-top{margin-top:0;padding-top:0}.content-width{width:100%;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-margin-start:auto;margin-inline-start:auto;position:relative;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}a{color:var(--linkText);text-decoration:none;cursor:pointer;outline:0}a[rel=external]::after{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-start:.25em;margin-inline-start:.25em;content:"\f35d";font-size:90%}a[role=button]:hover{text-decoration:none}a:focus,a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1}.ui-selectable-helper{background:var(--colorAccent);border:2px dashed var(--topBarBackground);position:absolute;z-index:500;opacity:.6}.image-container{transition:transform 180ms cubic-bezier(.25,1,.5,1)}.selected .image-container,.ui-selecting .image-container{transform:scale(.5)}.selected .list-item-play-gif,.ui-selecting .list-item-play-gif{transform:scale(.75)}.selected .image-container img,.selected .image-container svg,.ui-selecting .image-container img,.ui-selecting .image-container svg{border-radius:.5em;transform:translateZ(0)}.hidden{display:none!important}.visible{display:block!important}.fab.soft-hidden,.far.soft-hidden,.fas.soft-hidden,.soft-hidden{display:none}.soft-visible{display:block}.hidden-visibility{visibility:hidden;position:absolute;top:0}.touch-scroll{overflow:auto;-webkit-overflow-scrolling:touch}.or-separator{border-top:1px solid var(--bodySeparator);text-align:center;margin:10px 0 10px 0}.or-separator span{font-size:.93em;font-weight:400;color:var(--bodySeparator);text-transform:uppercase;text-align:center;background:var(--bodyBackground);display:inline-block;position:relative;padding:0 10px;top:-10px}.highlight{color:var(--alertText);background:var(--alertBackground)}.highlight:empty{display:none}.line-through{text-decoration:line-through}.line-separator{width:100%;height:1px;background:var(--bodySeparator);display:block;margin:20px 0;border:0}.number-figures,a.number-figures{font-size:1.21em;line-height:1.21em;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;-webkit-margin-start:0;margin-inline-start:0;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator);text-align:center}.number-figures:first-child{-webkit-padding-start:0;padding-inline-start:0;-webkit-border-start:none;border-inline-start:none}.number-figures:last-child{-webkit-padding-end:0;padding-inline-end:0}.number-figures b{font-weight:inherit}.number-figures .icon-heart4{position:relative;top:1px}.number-figures span:not(.icon){color:var(--bodyTextSubtle);text-transform:uppercase;font-size:.6em}a.number-figures:hover,a.number-figures:hover *{color:var(--linkText)}.loading-indicator,.loading-text{display:inline-block;line-height:inherit;vertical-align:top}.loading-text{-webkit-margin-start:5px;margin-inline-start:5px}.btn-alt{color:var(--bodyTextSubtle);font-size:13px;font-size:.93rem;margin:0 5px;display:inline!important}.btn-alt a:first-letter{text-transform:capitalize}.phone .btn-alt{margin:5px 0 0}.btn-alt a{-webkit-margin-start:5px;margin-inline-start:5px;cursor:pointer}a.link{font-size:13px;font-size:.93rem;text-decoration:none;font-weight:400}.pop-box-menu a.link--delete,[data-action=delete],a.link--delete{color:#e74c3c}html:not(.phone) .pop-box-menu a.link--delete:hover{background-color:#e74c3c}a.link--approve{color:#2ecc71}a.link span.icon,a.link:hover span.icon{text-decoration:none}a.link:hover span{text-decoration:underline}.disabled,.disabled a{color:var(--bodyTextDisabled)}.disabled a{text-decoration:none;cursor:default}.optional{font-size:.6em;color:var(--bodyTextSubtle);font-weight:400}.text-shadow{text-shadow:2px 2px 3px rgba(0,0,0,.75);-webkit-filter:dropshadow(color=#000000, offx=2, offy=2);filter:dropshadow(color=#000000, offx=2, offy=2)}.box-shadow{box-shadow:2px 2px 3px 0 rgba(0,0,0,.45)}.silent-links a,a.silent-links{color:inherit}.close-box .icon-circle{color:var(--bodyText);position:relative}.close-box .icon-close-box{color:#fff;position:absolute;inset-inline-start:0;top:0}.transparent-canvas{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAP///9/f3yH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7);background-repeat:repeat}.transparent-canvas.dark{background-image:url(data:image/gif;base64,R0lGODlhEAAQAIAAAOfn58rKyiH5BAAHAP8ALAAAAAAQABAAAAIfjG+gq4jM3IFLJgpswNly/XkcBpIiVaInlLJr9FZWAQA7)}input,select,textarea{font-family:inherit;font-size:1rem;display:inline-block}html:not(.safari) select,input,textarea{border-radius:3px;color:var(--inputText);border:1px solid transparent;background:var(--inputBackground)}input:-webkit-autofill,select:-webkit-autofill,textarea:-webkit-autofill{-webkit-text-fill-color:var(--inputText)!important}.input-focus,html:not(.safari) select:focus,input.search:focus,input:focus,textarea:focus{border-color:var(--colorAccent)}input:-webkit-autofill,input:-webkit-autofill:focus,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover{-webkit-text-fill-color:inherit;-webkit-box-shadow:inset 0 0 0 9999px transparent;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}select{font:inherit;outline:0}.text-input,textarea{outline:0}input[type=checkbox],input[type=radio]{border-radius:0;border:none;position:relative;vertical-align:baseline}.input-line-height,.text-input,input[type=text]{height:36px}.input-line-height{line-height:36px}.text-input,input[type=text]:not(.text-input),textarea{padding:7px 10px;width:100%}.ie7 .text-input,.ie7 input[type=text],.ie7 textarea{padding:10px;width:328px;height:14px}.ie8 .text-input,.ie8 input[type=text],.ie8 textarea,.ie9 .text-input,.ie9 input[type=text],.ie9 textarea{height:auto}.input,.input-label{position:relative;overflow:visible;scroll-snap-align:start}.input{margin:10px 0;font-size:1em}.input.first-child,.input:first-child{margin-top:0}.input-label{margin:20px 0}.input-label.first-child,.input:first-child{margin-top:0}.input-label h3,.input-label label,.input-label-label{font-weight:600;padding-bottom:5px;display:inline-block;font-size:1em}.input-label h3{display:block}.input-label h3 a,.input-label label a{font-weight:400}.input-label label .caption,.input-label label .optional{font-weight:400;font-size:.92em}.input-label .btn-alt{position:absolute;inset-inline-start:100%;top:23px;line-height:36px;-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.phone .input-label .btn-alt{position:static;-webkit-margin-start:0;margin-inline-start:0}.checkbox-label,.input-label{position:relative;font-size:.93em}.input .icon-input-submit{background:0 0;font-size:1.82em;color:#d9d9d9;position:absolute;inset-inline-end:.21em;top:.21em;cursor:pointer;line-height:1}.input .icon-input-submit.focus,.input .icon-input-submit:focus,.input .icon-input-submit:hover{color:var(--colorAccent)}.ie7 .input .icon-input-submit{top:2px}.ui-autocomplete{max-height:130px;overflow-y:auto;overflow-x:hidden}* html .ui-autocomplete{height:125px}.autocomplete-list{min-width:50%;position:absolute;z-index:1;inset-inline-start:0;-webkit-margin-before:0;margin-block-start:0;border:1px solid var(--bodySeparator);border-radius:var(--borderRadius);background:var(--bodyBackground);box-shadow:0 4px 14px rgba(0,0,0,.25);--borderRadius:3px}.autocomplete-list:empty{display:none}.autocomplete-list li{color:inherit;padding:4px 16px;display:block;cursor:pointer;border-bottom:1px solid var(--bodySeparator)}.autocomplete-list li:first-child{border-top-left-radius:var(--borderRadius);border-top-right-radius:var(--borderRadius)}.autocomplete-list li:last-child{border-bottom:0;border-bottom-right-radius:var(--borderRadius);border-bottom-left-radius:var(--borderRadius)}.autocomplete-list li.--focus,.autocomplete-list li:hover{background:var(--buttonAccentBackground);color:var(--buttonAccentText)}.hide-empty:empty{display:none}.input-column{width:350px}.input-warning{color:var(--bodyTextSubtle);inset-inline-end:0;top:0}.input-below{margin-top:5px;display:block;position:static}.red-warning{color:#d74634}.input-password input[type=password][id=new-password]{-webkit-padding-end:65px;padding-inline-end:65px}.input-password .input-password-strength{position:absolute;inset-inline-end:11px;top:50%;margin-top:5px}.fancy-fieldset .input-password{display:flex;align-items:center}.fancy-fieldset .input-password-strength{inset-inline-end:0;top:auto;margin-top:0}.input-password-strength{background:var(--bodyEmpty)}.input-password-strength,.input-password-strength span{display:block;width:50px;height:8px}.input-password-strength span{width:0%;background-color:transparent}.input-password-strength [data-veredict=very-weak]{background-color:#e74c3c}.input-password-strength [data-veredict=weak]{background-color:#e67e22}.input-password-strength [data-veredict=average],.input-password-strength [data-veredict=strong],.input-password-strength [data-veredict=stronger]{background-color:#2ecc71}.checkbox-label{font-size:1em;display:block;margin:5px 0;position:relative}.checkbox-label:last-child{margin-bottom:0}.checkbox-label input{position:absolute;padding:0;margin:0;-webkit-margin-start:-20px;margin-inline-start:-20px}.btn-alt.checkbox-label input{position:static;vertical-align:text-top;-webkit-margin-end:4px;margin-inline-end:4px}.phone .btn-alt.checkbox-label{display:block!important;margin:10px 0}.checkbox-label label{-webkit-padding-start:20px;padding-inline-start:20px;font-weight:400;margin:0;padding-bottom:0}.fancy-box .checkbox-label label{display:flex;align-items:flex-start}.input-search{position:relative}input.search{font-size:1em;border-radius:200px;padding:0 25px 0 32px;-webkit-padding-end:3.0666em;padding-inline-end:3.0666em;-webkit-padding-start:2.3571em;padding-inline-start:2.3571em;line-height:100%;height:26px;height:1.86em;width:100%;border:1px solid transparent;top:0;inset-inline-start:0;outline:0;vertical-align:text-bottom}input.search::-webkit-input-placeholder{font-size:1em}input.search:-moz-placeholder{font-size:1em}input.search::-moz-placeholder{font-size:1em}input.search:-ms-input-placeholder{font-size:1em}input.search.one-icon-padding,input.search.two-icon-padding{-webkit-padding-end:2em;padding-inline-end:2em}input.search.two-icon-padding{-webkit-padding-start:2.2em;padding-inline-start:2.2em}.top-bar input.search{-webkit-padding-start:calc(1.625rem + 7px);padding-inline-start:calc(1.625rem + 7px);position:relative;-webkit-padding-end:34px;padding-inline-end:34px;background:0 0;border:0;box-shadow:none!important}.top-bar input{color:var(--topBarText)}.ie7 input.search,.ie8 input.search,.ie9 input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:26px;height:26px}.ie7 input.search{padding:0;width:200px}.input-search span{position:absolute;cursor:pointer}.input-search .icon--search{color:var(--inputText);left:.85714286rem;top:50%;transform:translateY(-50%)}.top-bar .input-search .icon--search{font-size:1.28571429rem;line-height:50px;width:1.625rem;left:0;text-align:center}.input-search .icon--search,.top-btn-text .icon--search{font-size:1em;width:1em}.input-search .icon--close,.input-search .icon--settings{color:var(--inputText);padding:.5em;top:0;font-size:1em}.input-search .icon--close:hover,.input-search .icon--settings:hover{color:var(--colorAccent)}.input-search .icon--close{-webkit-padding-end:.75em;padding-inline-end:.75em;margin-right:-.5em}#menu-fullscreen .input-search .icon--settings,.input-search .icon--settings{inset-inline-end:22px}#menu-fullscreen .input-search .icon--close,.input-search .icon--close{inset-inline-end:4px}.ie7 .input-search .icon--close,.ie8 .input-search .icon--close,.ie9 .input-search .icon--close{display:none}select{-webkit-padding-start:7px!important;padding-inline-start:7px!important}.ie7 select{width:100%!important;padding:0!important;height:auto!important}select option{padding:4px 10px;margin:0}textarea{resize:both;height:80px}.input-upload{position:relative}.user-settings-avatar{min-height:160px;height:auto}.user-settings-avatar-container{position:relative}.user-settings-avatar-container,.user-settings-avatar-container .user-image{font-size:160px;width:1em;height:1em}.user-settings-avatar .loading-placeholder{position:absolute;inset-inline-start:0;top:0;background:var(--bodyEmpty)}.phone .user-settings-avatar-container{margin:0 auto 10px!important}.input-upload .btn-container{margin:0 0 5px 0}.input-upload .btn-alt{-webkit-margin-start:0;margin-inline-start:0}.arrow-down{border-width:4px 4px 0 4px;border-color:#333 transparent transparent transparent;border-color:#333 transparent transparent transparent;content:""}.arrow-down{border-style:solid;display:inline-block;height:0;width:0;vertical-align:middle}.sign-services li{display:inline-block;margin:0 4px 4px 0}.sign-service{font-size:.93em;padding:0 8px;line-height:30px;height:29px}.sign-service .btn-icon{font-size:inherit;width:auto}.sign-services-compact .btn-text{display:none}.link-service,.sign-service{color:#fff;display:inline-block;text-decoration:none!important}.link-service span,.sign-service{border-radius:3px}.link-service{font-weight:400;height:28px;position:relative}.link-service span{display:block;line-height:28px;text-align:center!important}.link-service .btn-icon{width:28px;height:28px;-webkit-margin-end:4px;margin-inline-end:4px;position:absolute;inset-inline-start:0;top:0}.link-service span.sign-text{padding:0 20px;-webkit-margin-start:32px;margin-inline-start:32px}.btn-social .btn-icon,.sign-service .icon{color:#fff;position:relative;display:inline-block}.buttons{display:flex;flex-wrap:wrap;gap:5px;justify-content:flex-start}.buttons.text-align-right{justify-content:flex-end}.phone .buttons{justify-content:center}.buttons .btn{display:inline-block;text-align:center}.btn-container{margin-top:20px;margin-bottom:20px;position:relative}.btn{height:36px;line-height:36px;height:2.57142857rem;line-height:2.57142857rem;font-family:inherit;font-size:1em;font-weight:400;padding:0 10px;border-radius:3px;cursor:pointer;display:inline-block;text-decoration:none;border:1px solid transparent;white-space:nowrap}.btn>*{pointer-events:none}.btn,.btn:active,.btn:focus,.btn:hover{text-decoration:none}.btn.default:active,.btn:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-icon{display:inline-block;text-align:center;width:1.4em}.btn-text{-webkit-margin-start:4px;margin-inline-start:4px}.btn-text:empty{display:none}.btn-big{font-size:16px;font-size:1.143rem;height:38px;line-height:38px;-webkit-padding-start:1em;padding-inline-start:1em;-webkit-padding-end:1em;padding-inline-end:1em}.btn-small{font-size:13px;height:30px;line-height:30px;font-size:.92rem;height:2.14285714rem;line-height:2.14285714rem}.btn-input{font-weight:600;font-size:.93em;-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px}.btn-32{width:32px;height:32px;text-align:center;display:inline-block}.btn-32 .btn-icon{font-size:18px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.btn-capsule{border-radius:100px;border-color:rgba(255,255,255,.1);background-color:rgba(0,0,0,.5);-webkit-backdrop-filter:blur(17.5px) saturate(1.8);backdrop-filter:blur(17.5px) saturate(1.8);background-image:none;height:auto;color:#fff;text-shadow:none;font-size:.93em;height:2.15em;line-height:2.15em;font-weight:400;padding:0 1.15em;box-shadow:none;-webkit-filter:none;filter:none}.btn-capsule:hover{background-color:rgba(0,0,0,.7);border-color:rgba(255,255,255,.3)}.no-rgba .btn-capsule{border-color:#666;background-color:none;zoom:1}.btn-capsule:active{box-shadow:none}.btn-capsule .btn-icon{font-size:.93em}.btn.accent{color:var(--buttonAccentText);border:1px solid transparent;background:var(--buttonAccentBackground)}.btn.accent:not(.outline):hover{color:var(--buttonAccentHoverText);background:var(--buttonAccentHoverBackground)}.btn.accent.outline{color:var(--buttonAccentBackground);border-color:var(--buttonAccentBackground);box-shadow:none}.btn.accent.outline:hover{color:var(--buttonAccentHoverBackground);border-color:var(--buttonAccentHoverBackground)}.btn.default{color:var(--buttonDefaultText);border-color:var(--buttonDefaultBorder);background:var(--buttonDefaultBackground)}.btn.default--hover:not(.outline),.btn.default:not(.outline):hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder)}.btn.default.outline{color:var(--buttonDefaultBackground);border-color:var(--buttonDefaultBackground);box-shadow:none}.btn.default.outline:hover{color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBackground)}.btn.disabled,.btn.disabled:hover{color:var(--bodyTextSubtle);background-color:var(--buttonDefaultBackground);background-image:none;box-shadow:none;cursor:default}.btn.disabled.outline,.btn.disabled.outline:hover{color:var(--bodyTextSubtle);border-color:var(--bodyTextSubtle)}.btn.plain,.btn.plain:hover{background:0 0;text-shadow:none;border-color:transparent;box-shadow:none;padding:0;color:inherit}.btn.plain:active{box-shadow:none}.btn.active{background-image:none;background-color:var(--colorAccent);border-color:var(--colorAccent);-webkit-filter:none;filter:none}.btn.grey,.btn.grey.off:hover{background-color:#eee}.btn.grey:hover{background-color:#e9e9e9}.btn.grey.outline{color:#eee}.btn.orange,.btn.orange.off:hover{border-color:#fe771d;background-color:#fe771d}.btn.orange:hover{background-color:#fe6b0a}.btn.orange.outline{color:#fe771d}.btn.purple,.btn.purple.off:hover{border-color:#8e44ad;background-color:#8e44ad}.btn.purple:hover{background-color:#8e44ad}.btn.purple.outline{color:#8e44ad}.btn.blue,.btn.blue.off:hover{border-color:var(--colorBlue);background-color:var(--colorBlue)}.btn.blue:hover{background-color:#2879b0}.btn.blue.outline{color:var(--colorBlue)}.btn.green,.btn.green.off:hover{background-color:var(--colorGreen)}.btn.green:not(.outline):hover{background-color:var(--colorGreenHover)}.btn.green.outline{color:var(--colorGreen);border-color:var(--colorGreenHover)}.btn.red,.btn.red.off:hover{border-color:var(--colorRed);background-color:var(--colorRed)}.btn.red:not(.outline):hover{background-color:var(--colorRedHover)}.btn.red.outline{color:var(--colorRed)}.btn.red.outline:hover{color:var(--colorRedHover);border-color:var(--colorRedHover)}.btn.white,.btn.white.off:hover{border-color:#fff;background-color:#fff}.btn.white:hover{background-color:#fff}.btn.white.outline{color:#fff}.btn.black,.btn.black.off:hover{border-color:#3a3a3a;background-color:#3a3a3a}.btn.black:hover{background-color:#343434}.btn.black.outline{color:#3a3a3a}.btn.active,.btn.black,.btn.blue,.btn.green,.btn.orange,.btn.red{color:#fff;border:1px solid transparent}.btn.grey,.btn.white{color:#161c1d}.btn.off{cursor:default}.btn.off:active{box-shadow:none}.btn-social{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);background-image:none;box-shadow:none;border:1px solid transparent}.btn-social.btn-at .btn-icon,.btn-social.btn-share .btn-icon{color:var(--buttonDefaultText)}.btn-social,.btn-social:hover{text-decoration:none;text-shadow:none}.btn-x-twitter,.link-x-twitter span{background:#000}.btn-twitter,.link-twitter span{background:#55acee}.btn-facebook,.link-facebook span{background:#3b5998}.btn-google,.btn-google-plus,.link-google span,.link-google-plus span{background:#d74836}.btn-mail{background:#ccc;color:var(--bodyText)}.btn-mail span{color:var(--bodyText)}.btn-tumblr{background:#35465c}.btn-pinterest{background:#bd081c}.btn-stumbleupon{background:#eb4924}.btn-blogger{background:#f57d00}.btn-whatsapp{background:#43d854}.btn-telegram{background:#08c}.btn-weixin{background:#7bb32e}.btn-weibo{background:#df2029}.btn-qzone{background:#ffce00}.btn-qq{background:#121214}.btn-reddit{background:#ff4500}.btn-reddit .btn-icon{color:#fff}.btn-vk,.link-vk span{background:#45668e}.btn.outline,.btn.outline:hover{background:0 0;border:1px solid;box-shadow:none}.pop-btn,.top-btn-el,a[data-modal]{-webkit-tap-highlight-color:transparent}.pop-btn *,.top-btn-el *{-webkit-tap-highlight-color:rgba(0,0,0,.2)}.pop-btn,.top-btn-el{display:inline-block;position:relative;cursor:pointer}.pop-box-inner{cursor:default;display:block;-webkit-overflow-scrolling:touch;overflow:auto}.pop-box-inner form{margin-top:-20px;margin-bottom:-20px}.btn.pop-btn .pop-box{line-height:100%}.pop-btn-text{color:var(--linkText);cursor:pointer}.ie7 .pop-btn-text,.ie8 .pop-btn-text{-webkit-padding-end:0;padding-inline-end:0}.pop-btn-text .arrow-down{vertical-align:middle;-webkit-margin-start:5px;margin-inline-start:5px;border-top-color:var(--linkText)}.pop-btn.disabled{cursor:default}.pop-btn.disabled .pop-btn-text{color:var(--bodyTextDisabled);cursor:default}.pop-btn.disabled .arrow-down{border-top-color:var(--bodyTextDisabled)}.pop-box{color:var(--menuText);background:var(--menuBackground);-webkit-backdrop-filter:blur(27.5px) saturate(1.8);backdrop-filter:blur(27.5px) saturate(1.8);display:none;font-size:1em;z-index:200;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid var(--menuBorder)}.phablet .pop-box,.phone .pop-box{font-size:inherit;border-color:transparent}.pop-box .or-separator{border-top-color:var(--menuSeparator);margin-left:10px;margin-right:10px}.phablet .pop-box .or-separator,.phone .pop-box .or-separator{border-top-color:var(--topBarText);opacity:.25}@media (min-width:992px){.pop-box{position:absolute;top:20px;min-height:20px;min-width:190px;box-shadow:0 4px 14px rgba(0,0,0,.25);border-radius:6px;box-sizing:content-box;--columnGutter:5px;--columnWidth:190px;--columnWidthOuter:calc(var(--columnWidth) + var(--columnGutter))}.header--height .pop-box{min-width:240px}.pop-box,.pop-box.left-anchor{inset-inline-start:0}.pop-box.anchor-center{inset-inline-start:50%!important}.pop-box.anchor-right{inset-inline-start:auto;inset-inline-end:0}.pop-box.pbcols2{width:calc(2 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols3{width:calc(3 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols4{width:calc(4 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols5{width:calc(5 * var(--columnWidthOuter) + var(--columnGutter))}.pop-box.pbcols2 li,.pop-box.pbcols3 li,.pop-box.pbcols4 li,.pop-box.pbcols5 li{border-radius:6px}.pop-box-menucols ul{padding:10px 0;overflow:auto}.pop-box-menucols li{width:var(--columnWidth);float:left;margin:0 0 0 5px}[dir=rtl] .pop-box-menucols li{float:right}.pop-box-menucols li:first-child a,.pop-box-menucols li:last-child a{border-radius:0}}.pop-box-menu{font-size:13px;font-size:.92857143rem;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.phablet .pop-box-menu,.phone .pop-box-menu{font-size:inherit}.pop-box-label{color:inherit;margin:10px;text-transform:uppercase;font-weight:700;font-size:85%;cursor:default}.pop-box-block{padding:0 10px}.pop-box-block .current::before{font-weight:900;font-family:"Font Awesome 5 Free";-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;-webkit-margin-end:.25em;margin-inline-end:.25em;content:"\f205";font-size:90%}.pop-box-menu .menu-item,.pop-box-menu a{display:block;padding:6px 10px;text-decoration:none;font-weight:400;line-height:143%;color:var(--menuItemText)}.pop-box-block a{display:inline-block;padding:6px;border-radius:.25em;line-height:1;font-size:1em}.phablet .pop-box,.phone .pop-box{color:var(--topBarText)}.phablet .pop-box-menu .menu-item,.phablet .pop-box-menu a,.phone .pop-box-menu .menu-item,.phone .pop-box-menu a{padding:10px;color:inherit}.phablet .pop-box-menu li.with-icon a .btn-icon,.phone .pop-box-menu li.with-icon a .btn-icon{top:11px}@media (min-width:992px){.pop-box-menu .menu-item,.pop-box-menu a{border-bottom:0}}.pop-box-menu a.focus,html:not(.phone) .pop-box-menu a:hover{background:var(--menuItemHoverBackground);color:var(--menuItemHoverText)}.pop-box-menu li.current a,.pop-box-menu li.current a:hover{color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground)}.pop-box-menu ul{display:block;padding:0}.phablet .pop-box-menu ul,.phone .pop-box-menu ul{display:flex;flex-wrap:wrap}.phablet .pop-box-menu ul li,.phone .pop-box-menu ul li{width:50%}@media (min-width:992px){.pop-box-menu ul{margin:5px 0}}.pop-box-menu li{display:block;text-align:start;overflow:hidden;position:relative}.pop-box-menu li.with-icon a{-webkit-padding-start:36px;padding-inline-start:36px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}html:not(.phone):not(.phablet) .header--height .pop-box-menu li a{-webkit-padding-end:25px;padding-inline-end:25px}.pop-box-menu li a kbd{position:absolute;top:50%;transform:translateY(-50%);inset-inline-end:10px;border-radius:2px;display:block;line-height:1;font-size:.9em;opacity:.5}.pop-box-menu li a:hover kbd{opacity:1}.phablet .pop-box-menu li a kbd,.phone .pop-box-menu li a kbd{display:none}.pop-box-menu li.with-icon a .btn-icon{position:absolute;inset-inline-start:10px;top:8px}.pop-box-menu li.current,.pop-box-menu li.current a{font-weight:600}.pop-box-menu li.current a:hover{cursor:default}.pop-box-userdetails{padding:10px;width:120%;min-width:var(--columnWidth);cursor:default;inset-inline-start:42px;line-height:normal;top:0!important;margin-top:0!important}.phablet .pop-box,.phone .pop-box{position:fixed;bottom:0;inset-inline-start:0!important;width:100%;top:auto!important;background:var(--topBarBackground);color:var(--topBarText)}@media all and (display-mode:standalone){.phablet .pop-box,.phone .pop-box{padding-bottom:30px}}.pop-box-header{font-weight:700;padding:15px 10px;position:relative;text-align:start;color:var(--topBarText)}.pop-box-header .icon--close{position:absolute;inset-inline-end:10px;top:50%;margin-top:-7px;font-size:1em;text-align:end}@media (min-width:992px){.pop-box-header{display:none}}.top-bar-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar,.top-bar ul li.pop-btn,.top-bar ul li.top-btn-el,.top-bar-placeholder{height:50px}.top-btn-create-account,.top-btn-text{line-height:50px}.top-btn-text{-webkit-tap-highlight-color:transparent}.follow-scroll{transition:all .4s ease-out}.scroll-down #dashboard .top-sub-bar--1{top:50px}#dashboard .top-sub-bar--1:not(.follow-scroll){position:static}.top-bar,.top-sub-bar{left:0;right:0;width:100%;position:static;height:50px}.follow-scroll,.top-bar{position:-webkit-sticky;position:sticky}.top-bar{color:var(--topBarText);z-index:900;top:0}.top-bar--main{z-index:910}.top-bar--main .content-width{padding-left:5px;padding-right:5px}.top-sub-bar{color:var(--bodyText);z-index:500;overflow:visible;top:50px}body.pop-box-show .top-sub-bar--1{z-index:1}.top-sub-bar--1 .content-tabs-container{z-index:2}body.landing .top-bar,body.split .top-bar{position:fixed}.phablet .pop-box-show .top-bar,.phone .pop-box-show .top-bar{z-index:1}.follow-scroll-wrapper.position-fixed,.top-bar::before,.top-sub-bar::before{background:var(--topBarBackground);-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px)}.top-sub-bar::before{background:var(--topSubBarBackground)}.top-bar::before,.top-sub-bar::before{-webkit-backface-visibility:hidden;backface-visibility:hidden}.top-bar::before,.top-sub-bar::before{width:100%;min-height:50px;position:absolute;content:" "}.top-bar .content-width,.top-sub-bar .content-width{position:relative;height:100%;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.top-bar-logo{width:100%;height:100%;position:absolute;top:0;text-align:center;inset-inline-start:0}.top-bar-logo img{height:20px}.top-bar-logo>a{display:inline-block;vertical-align:top;position:relative;top:50%;transform:translateY(-50%);text-decoration:none;font-weight:400;font-size:24px;color:var(--topBarText)}.top-bar-logo img{display:block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.top-bar ul{list-style:none}.top-bar li.pop-btn,.top-bar li.top-btn-el{float:left;-webkit-padding-end:5px;padding-inline-end:5px;-webkit-padding-start:5px;padding-inline-start:5px;position:relative}[dir=rtl] .top-bar li.pop-btn,[dir=rtl] .top-bar li.top-btn-el{float:right}@media (min-width:992px){.top-bar li.pop-btn,.top-bar li.top-btn-el{-webkit-padding-end:10px;padding-inline-end:10px;-webkit-padding-start:10px;padding-inline-start:10px}.top-bar .top-bar-notifications.pop-btn{-webkit-padding-end:0;padding-inline-end:0}}.top-bar ul .pop-btn.current,.top-bar ul .top-btn-el.current{border-bottom:3px solid var(--colorAccent)}.top-bar ul .pop-btn.current .top-btn-text,.top-bar ul .top-btn-el.current .top-btn-text{text-shadow:none;box-shadow:none}.top-bar ul li.top-btn-el a{text-decoration:none;color:inherit}.phablet .top-bar-left,.phone .top-bar-left{-webkit-margin-start:-5px;margin-inline-start:-5px}.phablet .top-bar-right,.phone .top-bar-right{-webkit-margin-end:-5px;margin-inline-end:-5px}.top-btn-el.current[data-nav=mobile-menu]{border-bottom-color:transparent!important}.top-btn-el.current[data-nav=mobile-menu] .top-btn-text .icon:before{color:var(--topBarText)!important;content:"\f00d"}.top-bar-right li.pop-btn:last-child,.top-bar-right li.pop-btn:last-child .arrow-down{-webkit-margin-end:0;margin-inline-end:0}.top-btn-create-account,.top-btn-text{display:block;font-weight:400;font-size:1em;height:100%}#menu-fullscreen .btn.top-btn-create-account,.btn.top-btn-create-account:not(.grey):not(.white),.top-btn-text{color:inherit}.top-btn-text{text-decoration:none;color:var(--topBarText)}.top-bar #menu-fullscreen .top-btn-text{color:var(--topBarText)}body.landing .top-btn-text{color:var(--topBarText)}.top-btn-text .icon{-webkit-margin-end:7px;margin-inline-end:7px;position:relative;top:0;display:inline-block;font-size:18px;width:18px;font-size:1.28571429rem;width:1.625rem;line-height:50px;text-align:center}.current .top-btn-text .icon{color:var(--colorAccent)}.top-btn-text .btn-text{-webkit-margin-start:0;margin-inline-start:0}.top-btn-text .arrow-down{position:relative;margin:0 0 0 5px}.top-btn-text .btn-text{vertical-align:top}.top-btn-text .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen .top-bar-notifications .btn-text{display:inline-block}#menu-fullscreen #top-bar-user,#menu-fullscreen [data-nav=upload]{display:none}.top-bar-notifications-container{-webkit-margin-end:2px;margin-inline-end:2px;cursor:default}.top-bar-notifications-header{font-size:.93em;line-height:1;padding:12px 10px;overflow:auto}.top-bar-notifications-header,.top-bar-notifications-list li{border-bottom:1px solid var(--menuSeparator)}.top-bar-notifications-header h2{font-size:1em;font-weight:700;float:left}[dir=rtl] .top-bar-notifications-header h2{float:right}.top-bar-notifications-header a{float:right}[dir=rtl] .top-bar-notifications-header a{float:left}.top-bar-notifications-list li{display:block;text-decoration:none;padding:10px;position:relative;min-height:68px;-webkit-padding-start:68px;padding-inline-start:68px}.top-bar-notifications-list li:last-child{border-bottom:0}.top-bar-notifications-list li:hover{background:rgba(0,0,0,.02)}.top-bar-notifications-list li.transition{transition:background-color 150ms linear}.top-bar-notifications-list li.new,.top-bar-notifications-list li.persistent{background:#fffad9}.ie7 .top-bar-notifications-list li{min-height:48px}.top-bar-notifications-list li .user-image{width:48px;height:48px;position:absolute;left:10px;top:10px}.top-bar-notifications-list li .user-image img{width:100%;height:100%;display:block}.top-bar-notifications-list li .user-image span.icon{font-size:48px;width:48px;height:48px;-webkit-margin-start:-24px;margin-inline-start:-24px;margin-top:-24px}.top-bar-notifications-list li .how-long-ago{display:block;font-size:11px;color:var(--bodyTextSubtle)}.top-bar-notifications .top-btn-number{position:absolute;z-index:1;border-radius:100px;zoom:.75;inset-inline-end:-8px;top:10px;visibility:hidden}.top-bar-notifications .top-btn-number.on{visibility:visible}@media (min-width:992px){.top-bar .pop-box{margin:10px;z-index:200}}.top-bar-search-input .icon--close{inset-inline-end:-4px}.top-bar-search-input .icon--settings{inset-inline-end:14px}.top-bar .top-bar-search-input .icon--search{color:var(--colorAccent)}.top-bar-search-input{display:flex;justify-content:center;align-items:center}.top-bar-search-input .input-search{position:relative}.top-bar-search-input input{font-size:1em;border-width:0;-webkit-padding-start:36px;padding-inline-start:36px}.tone-light .top-bar .top-bar-search-input input{border-width:1px}.top-bar-left .pop-box{inset-inline-start:-10px}.top-bar-right .pop-box{inset-inline-start:auto;inset-inline-end:-10px}.top-bar--main .pop-box{top:calc(50% + 10px)}#top-predictive-search.pop-box{width:200px;inset-inline-start:0;font-size:100%}.top-bar .pop-account .or-separator{margin-top:30px;margin-bottom:30px}.top-btn-create-account{text-decoration:none;display:inline;padding:4px 12px;height:26px}.top-bar .opened .top-btn-text span:not(.btn-text),.top-bar .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.phone .top-bar .top-btn-text:hover span:not(.btn-text){color:inherit}.phone .top-bar .current .top-btn-text:hover span:not(.btn-text){color:var(--colorAccent)}.ios .top-bar .top-btn-text span:not(.btn-text):not(.top-btn-number):hover{color:var(--bodyText)}.ios .top-bar .opened .top-btn-text span:not(.btn-text),.ios .top-bar .opened .top-btn-text:not(.top-btn-number){color:var(--colorAccent)}.top-bar .btn:hover:not(.white):not(.grey),.top-bar .btn:not(.white):not(.grey),.top-bar .opened .btn:not(.white):not(.grey){color:#fff}.current .top-btn-create-account:hover{background:inherit}.current .top-btn-create-account{padding:0;background:0 0}.top-btn-number{background:#555;color:#ddd;font-size:12px;font-weight:400;border-radius:3px;padding:0 7px;position:relative;display:block;line-height:22px;height:22px;top:-2px}#menu-fullscreen .top-btn-number{display:inline-block;position:absolute;-webkit-margin-end:5px;margin-inline-end:5px;top:10px;vertical-align:text-bottom;inset-inline-start:30px;inset-inline-end:auto}.opened .top-btn-number.on,.tone-light.ios .top-bar .top-btn-number.on,.tone-light.top-bar .top-btn-number.on,.top-bar .top-btn-text:hover .top-btn-number.on,.top-btn-number.on,.top-btn-number.on:hover{background:#d90000;color:#fff}.pop-account .pop-box-inner{padding:20px 10px;cursor:default}.pop-account .title,.pop-account h2{font-size:1em;text-align:center;margin-top:5px;font-weight:400;display:block}.pop-account .sign-services{margin:15px 0 11px 0}.pop-account input.text-input,.pop-account input[type=password],.pop-account input[type=text]{width:100%}.ie7 .pop-account input.text-input{width:266px;height:auto}.pop-account .checkbox-label{display:inline-block;margin:0}#top-bar-user .top-btn-text .user-image{position:relative;top:50%;margin-top:-13px;width:1em;height:1em;float:left;font-size:26px;background:0 0;color:inherit;-webkit-margin-end:0;margin-inline-end:0}[dir=rtl] #top-bar-user .top-btn-text .user-image{float:right}#top-bar-user-menu.pop-box{width:150px}.header{position:relative}.header-icon{color:var(--colorAccent)}.header-tabs{min-height:50px}.header.follow-scroll{-webkit-margin-end:-10px;margin-inline-end:-10px;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;overflow:visible;position:-webkit-sticky;position:sticky;min-height:50px}.header.fixed.follow-scroll{border-bottom:0}.header .header-title,.header h1{font-size:1em}.header>*{vertical-align:middle}.header .header-title,.header .heading,.header .heading *,.header>h1{word-break:break-word}.header-tabs .heading,.header-tabs .heading *,.header-tabs>.header-title,.header-tabs>h1{line-height:50px}.header .header-title,.header .heading,.header>h1{font-size:1.57142857rem;font-weight:400;display:inline-block;color:inherit}.header .header-title a,.header h1 a{color:inherit;text-decoration:none}.header .header-title strong,.header .heading strong,.header h1 strong{font-weight:inherit}.header.header-tabs .header-title,.header.header-tabs h1{-webkit-margin-end:5px;margin-inline-end:5px}.header ul.content-tabs{display:inline-block}.phablet .header ul.content-tabs,.phone .header ul.content-tabs{float:none;display:inline-block;inset-inline-start:10px;inset-inline-end:10px;position:absolute;z-index:1;white-space:nowrap}.phablet .header.follow-scroll ul.content-tabs,.phone .header.follow-scroll ul.content-tabs{position:absolute;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phablet .header:not(.follow-scroll) ul.content-tabs,.phone .header:not(.follow-scroll) ul.content-tabs{top:auto}.header-content-left{float:left}[dir=rtl] .header-content-left{float:right}.header-content-right{float:right;height:auto;-webkit-margin-start:auto;margin-inline-start:auto}[dir=rtl] .header-content-right{float:left}@media (max-width:340px){.header-content-right.breaks-ui{clear:both;position:static!important;-webkit-margin-start:0;margin-inline-start:0}}.phablet .header-content-right:not(.phablet-float-none),.phone .header-content-right:not(.phone-float-none){position:absolute;inset-inline-end:0;top:0;float:right}[dir=rtl].phablet .header-content-right:not(.phablet-float-none),[dir=rtl].phone .header-content-right:not(.phone-float-none){float:left}.header-content-right .number-figures{margin-top:14px;-webkit-border-start:1px solid var(--bodySeparator);border-inline-start:1px solid var(--bodySeparator)}.header-content-right .number-figures:first-child{-webkit-border-start:0;border-inline-start:0}.header .header-link{font-size:1em;display:inline-block}.header .pop-btn.breadcrum-item{margin-top:0}.header .user-image{font-size:30px;width:1em;height:1em;margin-top:10px;float:left}[dir=rtl] .header .user-image{float:right}.header.header-content{position:relative;min-height:40px;border:0}.header.header-content .heading,.header.header-content .heading *{line-height:40px;height:40px}.header-content img{max-height:40px}.header-content .user-image{width:1em;height:1em;font-size:40px;margin-top:0;top:0}.header .user-image img,.header-content .user-image img{width:100%;height:100%;display:block}.header-description{line-height:1.4;max-height:10vh;overflow-y:scroll;overflow:auto}.header-description:empty{display:none}.header-description p{margin:10px 0}.header-content-breadcrum{float:left}[dir=rtl] .header-content-breadcrum{float:right}.breadcrum-item :not(.btn){line-height:normal}.breadcrum-text,.header-content-breadcrum .breadcrum-item{line-height:40px}.breadcrum-text,.breadcrum-text a{color:inherit}.breadcrum-text{font-weight:400}.breadcrum-item{-webkit-margin-end:5px;margin-inline-end:5px;position:relative;float:left}[dir=rtl] .breadcrum-item{float:right}.breadcrum-text a:hover{color:var(--linkText);text-decoration:none}.breadcrum-text .user-link{-webkit-margin-start:5px;margin-inline-start:5px}.header-content-breadcrum .arrow,.header-content-breadcrum .arrow-down,.header-content-breadcrum .arrow-right{-webkit-margin-start:5px;margin-inline-start:5px;position:relative}.header-content-breadcrum a:hover .arrow-down{border-top-color:var(--linkText)}.header-content-breadcrum a:hover .arrow-right{border-left-color:var(--linkText)}.header-content-breadcrum .pop-box h2{font-size:1.07em;line-height:1.2}.header-content-breadcrum .pop-box h2 a{line-height:1}.btn-container [dir=rtl] .header-content .btn{float:right}.header-content .btn:last-child{-webkit-margin-end:0;margin-inline-end:0}.follow-scroll{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;z-index:1}.follow-scroll-wrapper{left:0;right:0;z-index:50}.follow-scroll-wrapper.position-fixed .header{margin-bottom:-1px!important}.follow-scroll-placeholder{-webkit-backface-visibility:hidden;backface-visibility:hidden}.phablet .header:not(.header-tabs) .tab-menu,.phone .header:not(.header-tabs) .tab-menu{color:var(--buttonDefaultText);background:var(--buttonDefaultBackground);border-radius:4px;height:auto;line-height:1em;min-height:1em;padding:10px}.phablet .header:not(.header-tabs) .tab-menu:not(.--hide),.phone .header:not(.header-tabs) .tab-menu:not(.--hide){color:var(--buttonDefaultHoverText);background:var(--buttonDefaultHoverBackground);margin-bottom:10px}.phablet .header .tab-menu.--hide .tab-menu--show,.phablet .header .tab-menu:not(.--hide) .tab-menu--hide,.phone .header .tab-menu.--hide .tab-menu--show,.phone .header .tab-menu:not(.--hide) .tab-menu--hide{display:none}.tab-menu--hide,.tab-menu--show{-webkit-margin-start:2.5px;margin-inline-start:2.5px}.tab-menu{cursor:pointer;line-height:50px;min-height:50px}.tab-menu.--hide .btn-icon[data-content=tab-icon]{color:var(--colorAccent)}.tab-menu.--hide{color:var(--buttonDefaultText)}.tab-menu:not(.--hide){color:var(--buttonDefaultHoverText)}.content-tabs-container{position:relative;display:inline-block}.phablet .content-tabs-container--mobile,.phone .content-tabs-container--mobile{box-shadow:0 6px 4px rgba(0,0,0,.25);inset-inline-start:-10px;width:100%;width:100dvw}.phablet .content-tabs-wrap,.phone .content-tabs-wrap{height:50px;overflow-y:hidden;position:relative;-webkit-overflow-scrolling:touch;overflow-x:scroll;position:relative;display:none;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground);padding-left:10px;padding-right:10px}.content-tabs-wrap::-webkit-scrollbar{display:none}.content-tabs-wrap{display:inline-block;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.content-tabs li{scroll-snap-align:start}.content-tabs li:not(.current){transition-duration:.2s;transition-property:background-color}.content-tabs a{font-weight:400;color:inherit;text-decoration:none;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px}.phone .content-tabs li:last-child{-webkit-margin-end:15px;margin-inline-end:15px}.content-tabs-shade{content:" ";background:-webkit-linear-gradient(0deg,rgba(255,255,255,0),var(--bodyBackground));width:15px;height:100%;position:absolute;inset-inline-end:0;top:0;pointer-events:none;z-index:2}[dir=rtl] .content-tabs-shade{background:-webkit-linear-gradient(180deg,rgba(255,255,255,0),var(--bodyBackground))}.phablet .content-tabs a,.phone .content-tabs a{color:var(--menuItemText)}.content-tabs li.disabled a{cursor:default}.tab-menu .--show{display:none}.tab-menu.current .--show{display:inline-block}.tab-menu.current .--hide{display:none}.content-tabs li{float:left;font-size:1em}[dir=rtl] .content-tabs li{float:right}.phablet .content-tabs li,.phone .content-tabs li{float:none;border-bottom:0;display:inline-block}.content-tabs-vertical li{float:none;margin:0;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent}.content-tabs-vertical li>*{-webkit-padding-end:20px;padding-inline-end:20px;-webkit-padding-start:20px;padding-inline-start:20px}.header-content-right .content-tabs li{-webkit-margin-start:10px;margin-inline-start:10px;-webkit-margin-end:0;margin-inline-end:0}.content-tabs a,.content-tabs li,.content-tabs-wrap{height:50px;line-height:50px;display:block;border:0}.content-tabs-vertical a,.content-tabs-vertical li{height:38px;line-height:38px}.content-tabs li.current,.content-tabs li.visited,.content-tabs li.visited:hover{border-color:var(--colorAccent);border-style:solid;border-bottom-width:3px}.content-tabs li.current .btn-icon{color:var(--colorAccent)}.content-tabs li:not(.current):hover{background:var(--bodyEmpty)}.content-tabs li:not(.current):hover a .btn-icon{color:var(--colorAccent)}.content-tabs li.disabled:hover{border-bottom:0}.content-tabs li.current{border-color:var(--colorAccent)}.content-tabs li.visited{border-bottom-color:transparent}.content-tabs li.current.visited{border-color:#d93600}.content-tabs li.visited,.content-tabs li.visited a{color:#d93600}.content-tabs-vertical li.current,.content-tabs-vertical li:hover{border-bottom-width:0;border-left-width:2px}.content-tabs .tab-count{font-weight:400;color:var(--bodyTextSubtle)}.content-tabs .tab-count-block{font-weight:400;background:#d90000;border-radius:3px;padding:1px 4px;position:relative;top:-1px}.content-tabs .current .tab-count-block,.content-tabs .tab-count-block{color:#fff}.content-tabs li.disabled *{color:var(--bodyTextDisabled)}.header--centering{display:flex;align-items:center;flex-wrap:wrap}.header--height{overflow:visible;height:50px}.list-selection *{line-height:normal}#tabbed-content-group{margin-top:20px;padding-bottom:20px;position:relative}.content-listing .viewer-kb{opacity:0;position:fixed;bottom:-100px;z-index:1;left:0;right:0;background:linear-gradient(0deg,var(--topBarBackground) 0,rgba(0,0,0,0) 100%)}.--has-selection .content-listing.visible .viewer-kb{opacity:1;bottom:0}.content-listing .viewer-kb-input{color:var(--menuText);background:var(--menuBackground);border-radius:.5em;margin:1em;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);box-shadow:0 4px 14px rgb(0 0 0 / 25%)}#content-listing-tabs #tabbed-content-group{margin-top:0}#content-listing-tabs{padding-bottom:0;-webkit-margin-start:-10px;margin-inline-start:-10px;-webkit-margin-end:-10px;margin-inline-end:-10px}.tabbed-content{display:none;width:100%;overflow:hidden}.title{font-size:.93em;font-weight:700;margin-bottom:5px}.title.grid-columns{-webkit-margin-end:10px;margin-inline-end:10px;text-align:end;line-height:2}.phablet .title.grid-columns,.phone .title.grid-columns{-webkit-margin-end:0!important;margin-inline-end:0!important;text-align:start}.tabbed-content-section{overflow:auto}.tabbed-content-list{line-height:1.8}.tabbed-listing .tabbed-content{overflow:hidden}.table-li{display:table;width:100%}.table-li>li{padding-top:8px;padding-bottom:8px;border-bottom:1px solid var(--bodySeparator);list-style:none!important}.tabbed-content-list.table-li-hover>li:hover{background:var(--bodyEmpty)}.tabbed-content-list .table-li-header{font-weight:700}.tabbed-content-list.table-li-hover .table-li-header:hover{background:0 0}.table-li ul li:last-child{border-bottom:none}.desktop .table-li--mobile-display,.laptop .table-li--mobile-display,.largescreen .table-li--mobile-display,.phablet .table-li--mobile-display,.tablet .table-li--mobile-display{display:none!important}.viewer-title{flex-grow:1;order:2;font-size:1.57142857rem;line-height:1.43em;-webkit-padding-end:2em;padding-inline-end:2em}.panel-description:empty{display:none;margin:0!important;padding:0!important}.panel-description .description-text{font-size:1em;line-height:1.6em}.panel-description .description-meta{font-size:.93em}.panel-description .exif-meta{-webkit-padding-start:1.57em;padding-inline-start:1.57em;position:relative}.panel-description .exif-meta .camera-icon{color:var(--bodyTextDisabled);position:absolute;inset-inline-start:0;top:.21em;font-size:1.14em}.panel-description .exif-meta .exif-data{display:block;font-size:1em}.panel-thumbs{z-index:1;bottom:0;left:0;right:0;background:var(--viewerBackground)}.panel-thumb-list{overflow-x:auto;overflow-y:hidden;white-space:nowrap;text-align:center;height:50px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}.panel-thumb-list:empty{display:none}.panel-thumb-list li{position:relative;font-size:0;border-top:3px solid transparent;display:inline-block;line-height:50px}.panel-thumb-list li.current{border-color:var(--colorAccent)}.list-item-desc .panel-thumb-list li:hover img,.panel-thumb-list li.current img{opacity:1}.phablet .panel-thumb-list li.more-link,.phone .panel-thumb-list li.more-link{clear:both;line-height:100%;padding:10px 0}.panel-thumb-list a{display:block;line-height:0}.panel-thumb-list img{display:block;width:47px;height:47px;opacity:.4;transition:opacity 350ms ease}.panel-thumb-list li:hover img{opacity:1}.panel-share-item{margin-bottom:30px}.panel-share-item:last-child{margin-bottom:0}.panel-share-item .pre-title{-webkit-padding-start:200px;padding-inline-start:200px;line-height:20px;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--bodySeparator);font-weight:700}.phablet .panel-share-item .pre-title,.phone .panel-share-item .pre-title{-webkit-padding-start:0;padding-inline-start:0}.panel-share-item .title{line-height:36px;-webkit-margin-after:0;margin-block-end:0}.panel-share-item .grid-columns{position:relative}.panel-share-input-label{margin-bottom:10px;overflow:auto}.panel-share-input-label:last-child{margin-bottom:0}.panel-share-input{position:relative}.panel-share-networks{overflow:auto;text-align:center}.panel-share-networks h4.title{line-height:32px}.panel-share-networks li{display:inline-block;-webkit-margin-end:5px;margin-inline-end:5px;margin-bottom:5px}.panel-share-networks li a{display:block;width:32px;height:32px;position:relative}.panel-report h4.title{line-height:36px}.text-content{font-size:16px}.text-content li,.text-content p{line-height:160%;margin:10px 0}.text-content h1,.text-content h2,.text-content h3,.text-content h4{margin:40px 0 20px 0;font-weight:400;line-height:120%}.text-content h1{font-size:1.375em}.text-content h2{font-size:1.25em}.text-content h3{font-size:1.125em}.text-content h4{font-size:1.07em}.text-content h5{font-size:1em}.text-content h6{font-size:1em}.text-content ol,.text-content ul{-webkit-margin-start:20px;margin-inline-start:20px}.text-content li{list-style:disc outside;margin-top:0;margin-bottom:0}.form-content{position:relative;margin-top:20px}.form-content .input-label:first-child{margin-top:0}.signup-services-column h2{font-size:17px}.signup-services-column ul{margin:10px 0}.signup-services-column li:first-child{-webkit-margin-start:0;margin-inline-start:0}.signup-services-column li:last-child{-webkit-margin-end:0;margin-inline-end:0}.form-content .content-tabs-vertical{-webkit-margin-end:10px;margin-inline-end:10px;position:absolute;inset-inline-start:0;top:0}.form-content .content-tabs-vertical.position-fixed{position:fixed;inset-inline-start:auto;top:auto}.tabbed-input-column{-webkit-margin-start:200px;margin-inline-start:200px}.phablet .tabbed-input-column,.phone .tabbed-input-column{-webkit-margin-start:0;margin-inline-start:0}.account-link{position:relative}a.account-linked-profile{width:48px;height:48px;display:block}a.account-linked-profile img{width:100%;height:100%;display:block;border:0}.text-overflow-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}html.menu-fullscreen-visible{overflow:hidden}#menu-fullscreen{position:fixed;left:0;top:50px;bottom:0;right:0;height:calc(100vh - 50px);height:calc(100dvh - 50px);width:100vw;width:100dvw;overflow:auto}#menu-fullscreen .menu-hide{display:none}#menu-fullscreen .fullscreen{top:50px;height:calc(100% - 50px)}#menu-fullscreen>ul>li{display:block;float:none;border-bottom:0;margin:0!important;position:relative}#menu-fullscreen>ul>li .top-btn-text{padding:0 5px;background:inherit}#menu-fullscreen>ul>li .icon{-webkit-margin-end:7px;margin-inline-end:7px}#menu-fullscreen>ul>li .input-search .icon{-webkit-margin-end:0;margin-inline-end:0}#menu-fullscreen>ul>li a{text-decoration:none}#menu-fullscreen .input-search{-webkit-margin-start:5px;margin-inline-start:5px;top:10px;width:auto}#menu-fullscreen .input-search .search{border-radius:0;-webkit-padding-end:50px;padding-inline-end:50px;-webkit-padding-end:3.12rem;padding-inline-end:3.12rem}#menu-fullscreen .menu-fullscreen-show{display:block}#menu-fullscreen .menu-fullscreen-hide{display:none}body.upload-box-visible{margin-top:300px}body.upload-box-visible.no-margin-top{margin-top:280px}body.upload-box-visible .upload-box{display:block}.upload-box{clear:both;background:var(--bodyBackground)}.upload-box--fixed{position:fixed;left:0;right:0;z-index:200;background:var(--bodyBackground)}body:not(#upload) .upload-box--fixed{padding-top:50px;overflow:auto}.phone .upload-box--fixed{top:0;z-index:500;max-height:100%;overflow-y:auto;overflow-x:hidden}.upload-box--hidden{transform:translateY(-100%);top:-1px}.upload-box--show{transform:translateY(0)}.upload-box-inner{padding:40px 0;position:relative}.phone .upload-box-inner{padding:20px 0}.upload-box-inner .position-absolute{position:absolute;text-transform:uppercase;top:20px;line-height:20px}#upload .upload-box[data-queue-size="0"] .upload-box-heading,.phone .upload-box[data-queue-size="0"] .upload-box-heading{position:fixed;top:50%;left:0;right:0;transform:translateY(-50%);padding:10px}.upload-box-heading{text-align:center}.upload-box-heading .icon{font-size:100px;height:1em;display:inline-block;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;text-decoration:none;-webkit-tap-highlight-color:transparent}.upload-box-heading .heading,.upload-box-heading h2{font-size:26px;margin:10px 0;display:block}.upload-box-heading .heading a,.upload-box-heading h2 a{color:inherit;text-decoration:none}.upload-box-status a{display:inline-block}.upload-box-status-text{font-size:1em;line-height:1.4}.upload-box-allowed-files{inset-inline-start:0;font-size:11px;font-size:.79rem;color:var(--bodyTextSubtle)}.upload-box-close{text-decoration:none;inset-inline-end:0;font-size:11px;line-height:11px;font-size:.79rem;line-height:1em;color:var(--bodyText)}.upload-box-close:hover{text-decoration:none}.upload-box-close a{color:inherit;text-decoration:none}.upload-box-close .btn-icon{font-size:.9em;display:inline}@media (min-width:380px){.upload-input-col{width:350px}}.page-not-found{border-radius:10px;background:var(--bodyEmpty);text-align:center;padding:30px;font-size:16px;margin-top:20px}.page-not-found h1{font-size:30px;margin-bottom:10px}.page-not-found .input-search{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:20px}.page-not-found .input-search .icon--search{font-size:20px;inset-inline-start:14px;top:8px}.page-not-found .input-search .icon--close{top:3px;inset-inline-end:6px}.page-not-found input.search{height:36px;width:100%;font-size:15px;-webkit-padding-end:30px;padding-inline-end:30px;-webkit-padding-start:40px;padding-inline-start:40px}.ie7 .page-not-found input.search,.ie8 .page-not-found input.search,.ie9 .page-not-found input.search{-webkit-padding-end:10px;padding-inline-end:10px;line-height:36px}.content-listing{overflow:hidden;position:relative;clear:both}.pad-content-listing{width:calc(100% + 10px);-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:relative}.list-item{display:inline-block;position:relative}.js .content-listing{opacity:0}.js .jsly.content-listing{opacity:1}.list-item .disabled-mask{width:100%;height:100%;position:absolute;top:0;inset-inline-start:0;background:rgba(255,255,255,.5);z-index:1}.list-item:hover .hover-display,.phablet .list-item .hover-display,.phone .list-item .hover-display{display:block}.list-item.masked:hover .hover-display{display:none}.list-item .hover-display,html.--idle .list-item .hover-display:not(.idle-display),html.--idle .list-item-image-tools>div{opacity:0;transition:all 350ms ease}html:not(.--idle) .list-item:hover .hover-display{opacity:1}.phablet .list-item .hover-display,.phone .list-item .hover-display{opacity:1;transition:none}.list-item-image{position:relative;display:block;overflow:hidden;min-height:260px;text-align:center;background:var(--bodyEmpty);content-visibility:auto;contain:layout style paint}.list-item-image .image-container{display:inline-block;text-align:center;vertical-align:bottom;text-decoration:none;font-size:64px;width:100%;height:100%}.js .list-item-image .image-container.--media{width:100%;height:100%}.list-item-image .image-container .media,.list-item-image .image-container img,.list-item-image .image-container svg,.list-item-image .image-container video{display:block;position:relative;width:100%!important;height:100%;-o-object-fit:cover;object-fit:cover}.list-item-image .image-container .icon.empty{font-size:1em;opacity:.25}.list-item-image .image-container .empty{color:var(--bodyText);text-decoration:none}.selected .list-item-image .image-container .icon.empty,.ui-selecting .list-item-image .image-container .icon.empty{color:#fff}.list-item-image-btn{padding:5px 8px 5px 28px;font-size:.93em;background:var(--bodyBackground);position:absolute;top:10px;cursor:pointer;border-radius:2px}.list-item-image-btn.list-image-like-btn{inset-inline-start:10px}.list-item-image-btn span{font-size:15px;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.ie7 .list-item-image-btn span{inset-inline-start:4px;top:2px}.list-item-image-btn:hover span{color:var(--colorAccent)}.list-item-image-btn.liked{background:var(--colorAccent);color:#fff;display:block}.list-item-image-btn.liked:hover{background:#d90000}.list-item-image-btn.liked:hover span.icon-like{font-size:11px;padding:0;inset-inline-start:10px;color:#fff;margin-top:-6px}.list-item-image-btn.liked:hover span.icon-like:before{content:"\e01f"}.list-item-desc-title{width:100%;height:100%;padding:0 10px;inset-inline-start:0;bottom:10px;text-decoration:none}.list-item-desc-title>*{padding-bottom:5px;margin-bottom:-2.5px;-webkit-padding-start:5px;padding-inline-start:5px;-webkit-margin-start:-5px;margin-inline-start:-5px}.list-item-from{bottom:0;line-height:1}.phablet .content-listing:not([data-list=users]).list-item-desc-title,.phone .content-listing:not([data-list=users]).list-item-desc-title{display:none}.list-item-desc-title--center-y{top:50%;transform:translateY(-50%)}.list-item-desc-title-link{font-size:1.1em;font-weight:600;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:calc(100%)}@media (min-width:320px){.list-item-desc-title-link{width:calc(100% - 20px)}}.list-item-title{padding-top:0;padding-bottom:0;font-weight:400;text-align:center;height:40px;overflow:hidden}.list-item-title,.list-item-title *{font-size:1em;line-height:40px}.list-item-title a{font-weight:400;color:var(--bodyText)}.list-item-alt{background:#f9f9f9}.list-item-desc-height{height:100%}.list-item-overflow{height:110%;overflow:hidden}.list-item-desc{width:100%;font-size:.93em;line-height:1;box-shadow:0 1px 0 rgba(0,0,0,.1),0 0 0 transparent;border-bottom:1px solid rgba(0,0,0,.2)}.list-item-desc a,.list-item-desc b,.list-item-desc strong,.list-item.masked:hover .list-item-desc a,.list-item.masked:hover .list-item-title a{color:inherit}.list-item:hover .list-item-desc a,.list-item:hover .list-item-title a{color:var(--linkText)}.list-item-desc .user,.list-item-desc a.user img{border-radius:100%}.list-item-desc .user{float:left;margin-top:-20px;-webkit-margin-end:8px;margin-inline-end:8px;padding:3px;background:var(--bodyBackground);width:50px;height:50px}[dir=rtl] .list-item-desc .user{float:right}.list-item-desc .user:hover{background:var(--linkText)}.phablet .content-listing[data-list=images] .list-item-desc,.phone .content-listing[data-list=images] .list-item-desc{display:none}.list-item-desc strong{display:block}.list-item-card{border-radius:3px;min-height:82px}.list-item-card .user-image{display:block}.list-item-thumbs-container{overflow:hidden}.list-item-thumbs{overflow:auto;background:#f9f9f9;width:101%;margin-top:2px;margin-bottom:0;-webkit-margin-start:-1px;margin-inline-start:-1px}.list-item-thumbs li{background:#f6f6f6;-webkit-border-end:1px solid;border-inline-end:1px solid;-webkit-border-start:1px solid;border-inline-start:1px solid;border-color:#fff;float:left}[dir=rtl] .list-item-thumbs li{float:right}.list-item-desc{color:inherit;background:0 0;border:0;box-shadow:none;text-shadow:1px 1px 5px rgba(0,0,0,.5);opacity:0;transition:all 350ms ease;bottom:5px;position:absolute}.desktop .list-item .list-item-desc,.laptop .list-item .list-item-desc,.largescreen .list-item .list-item-desc,.list-item:hover .list-item-desc,.phablet .list-item .list-item-desc,.phone .list-item .list-item-desc,.tablet .list-item .list-item-desc{opacity:1}.list-item-desc *,.list-item-desc a,.list-item:hover .list-item-desc a{color:var(--listItemText)}.list-item-desc .list-item-overflow{bottom:0;inset-inline-start:0;padding:10px;position:absolute;height:auto}.content-listing-loading,.content-listing-more{text-align:center;margin:20px 0}.content-listing-more{display:none}.content-listing-loading{height:32px}.content-listing-loading .loading-indicator{position:static}.content-listing-pagination{text-align:center;font-size:1.3em;padding:0;color:inherit;font-weight:400;margin-top:20px}.js .content-listing-pagination{display:none}.content-listing-pagination.visible{display:flex!important}.content-listing-pagination a{text-decoration:none;font-weight:inherit;color:inherit;padding:.3em 1em;display:inline-block;border-radius:4px}.content-listing-pagination li.pagination-prev{text-align:end}.content-listing-pagination li.pagination-next{text-align:start}.content-listing-pagination a:hover{color:var(--linkText);background:var(--bodyEmpty)}.content-listing-pagination a.current{color:inherit}.phone .content-listing-pagination li.pagination-page{display:none}.content-listing-pagination li,.phone .content-listing-pagination li.pagination-page.pagination-current{display:inline-block}.content-listing-pagination li.pagination-next,.content-listing-pagination li.pagination-prev{flex-grow:4}.content-listing-pagination li.pagination-current{flex-grow:1}.content-listing-pagination .pagination-current a,.content-listing-pagination .pagination-current a:hover{color:inherit;background:initial;cursor:default}.pagination-disabled{visibility:hidden}.content-empty{padding:4em 2em;text-align:center;font-size:inherit;color:var(--bodyTextSubtle)}.content-empty .icon{color:var(--bodyTextSubtle);font-size:90px;width:90px;height:90px;display:inline-block}.content-empty .message,.content-empty h2{font-size:16px;margin-top:10px;line-height:160%}.sort-listing{display:none}.sort-listing .selection-count:before{content:" (";white-space:pre}.sort-listing .selection-count:after{content:")"}.disabled.sort-listing .selection-count:after,.disabled.sort-listing .selection-count:before{display:none}.user-image{display:inline-block}.user-image path{fill:red}.user-image,.user-image img{display:block}.default-user-image{color:var(--bodyText);text-align:center;position:relative;border-radius:100%;-webkit-backdrop-filter:blur(17.5px);backdrop-filter:blur(17.5px);background:var(--bodyBackground)}.checkered-background{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.1) 75%),linear-gradient(135deg,transparent 75%,rgba(0,0,0,.1) 75%);background-size:25px 25px;background-position:0 0,12.5px 0,12.5px -12.5px,0 12.5px}.default-user-image .icon{color:inherit;position:absolute;inset-inline-start:50%;top:50%;display:block;line-height:100%;font-size:1em;width:1em;height:1em;-webkit-margin-start:-.5em;margin-inline-start:-.5em;margin-top:-.5em}.default-user-image.size-70,img.user-image.size-70{width:70px;height:70px}.default-user-image.size-70 .icon{font-size:38px;-webkit-margin-start:-19px;margin-inline-start:-19px;margin-top:-19px}.default-user-image.size-60,img.user-image.size-60{width:60px;height:60px}.default-user-image.size-60 .icon{font-size:32px;-webkit-margin-start:-16px;margin-inline-start:-16px;margin-top:-16px}.default-user-image.size-40,img.user-image.size-40{width:40px;height:40px}.default-user-image.size-40 .icon{font-size:22px;-webkit-margin-start:-11px;margin-inline-start:-11px;margin-top:-11px}.user-social-networks{font-size:1em;margin-bottom:5px}.user-social-networks,.user-social-networks a{text-decoration:none;color:var(--bodyTextSubtle)}.user-social-networks a{padding:2px}.user-social-networks a:hover{color:var(--bodyText)}.top-user{position:relative;height:110px;margin-top:10px;margin-bottom:10px;height:auto;min-height:100px}.top-user.no-background{min-height:160px}.top-user>div{position:absolute;top:0}.top-user .top-user-credentials{position:static;-webkit-padding-end:220px;padding-inline-end:220px;clear:both;overflow:visible}.top-user.user-has-no-background .top-user-credentials{overflow:auto}.phone .top-user .top-user-credentials{-webkit-padding-end:0;padding-inline-end:0;-webkit-padding-start:0;padding-inline-start:0;width:100%;margin-bottom:10px;text-align:center;margin-top:-160px}.top-user-avatar{font-size:160px;z-index:500}a.top-user-avatar{display:block}.phone .top-user-avatar{position:relative}.top-user-avatar{position:absolute;left:0}.phablet .top-user:not(.no-background) .top-user-avatar,.tablet .top-user:not(.no-background) .top-user-avatar{top:calc(-.4em - 10px)}.top-user{-webkit-padding-start:190px;padding-inline-start:190px}.desktop .top-user:not(.no-background),.laptop .top-user:not(.no-background),.largescreen .top-user:not(.no-background),.phone .top-user{-webkit-padding-start:0;padding-inline-start:0}.desktop .top-user:not(.no-background) .top-user-avatar,.laptop .top-user:not(.no-background) .top-user-avatar,.largescreen .top-user:not(.no-background) .top-user-avatar{position:absolute;left:50%;-webkit-margin-start:calc(-.5em - 10px);margin-inline-start:calc(-.5em - 10px);top:calc(-.5em - 10px)}.phablet .top-user .user-image,.tablet .top-user .user-image{border:0;-webkit-margin-end:10px;margin-inline-end:10px}.top-user .user-image{font-size:1em;width:1em;height:1em;float:left}.header .user-image img,.header-content .user-image img,.top-user .user-image,.user-image,.user-image img{border-radius:50%;-o-object-fit:cover;object-fit:cover}.top-user:not(.no-background) .user-image{border:10px solid var(--bodyBackground)}.top-user:not(.no-background) img.user-image{background:var(--bodyBackground);border:10px solid transparent;box-sizing:content-box}.phone .top-user.no-background .top-user-credentials{margin-top:initial}.phone .top-user .top-user-credentials>a{display:inline-block}.top-user .header-content-right{inset-inline-end:0}.top-user .header-content-right>*{margin-bottom:10px}.top-user .header-content-right>:last-child{margin-bottom:0}.phone .top-user .header-content-right{position:relative}.phone .top-user .header-content-right>div{margin:10px auto;text-align:center}.phone .top-user .input-search{position:relative;top:auto}.phone .top-user .input-search form{position:relative}.top-user h1{font-size:1.8575em;font-weight:700;margin-bottom:5px;margin-top:10px;color:var(--bodyText)}.no-margin-top .top-user h1,.phone .top-user h1{margin-top:0}.top-user h1 a{color:inherit;text-decoration:none}.top-user .user-meta{margin-bottom:5px}.user-meta .icon--lock{-webkit-margin-end:5px;margin-inline-end:5px}[dir=rtl] .top-user .user-image{float:right}.phone .top-user .user-image{float:none;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-bottom:10px}.phone body.no-margin-top .top-user .user-image{margin-top:10px}.top-user .user-image.no-border{border:none}.top-user .number-figures{margin-top:0}.user-card.avatar{-webkit-padding-start:70px;padding-inline-start:70px}.user-card.no-avatar{-webkit-padding-start:0;padding-inline-start:0}.user-card .or-separator{margin-top:5px;margin-bottom:5px}.user-card .user-link{font-size:.93em}.user-card-header h2{font-size:15px;font-weight:400;margin-top:0;margin-bottom:2px}.user-card-header h2 a{color:inherit;text-decoration:none}.user-card-header div{color:var(--bodyTextSubtle)}.user-card-footer{overflow:hidden}.user-card-footer .user-social-networks{margin-top:3px}.top-user .input-search .icon--close{right:.5rem;top:50%;transform:translate(0,-50%)}.ad-space{text-align:center}.ad-margin-vertical{margin-top:20px;margin-bottom:20px}.ad-margin-horizontal{-webkit-margin-start:20px;margin-inline-start:20px;-webkit-margin-end:20px;margin-inline-end:20px}[role=menu]{position:relative;overflow:visible}.menu-box,[role=menu]>.menu-box{z-index:300}[role=menu]>.menu-box{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-height:10px;display:block;visibility:hidden;transition:350ms all ease-in-out;opacity:0;transform:translateY(-5px);transform-origin:top;max-height:100vh;max-height:100dvh}[role=menu].opened>.menu-box{visibility:visible;opacity:1;transform:translateY(0)}@media (min-width:768px){[role=menu]>.menu-box{transition:none}}.menu-box{border:0}.menu-box,.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{background:var(--bodyBackground);border-radius:3px;box-shadow:0 0 15px 0 rgba(0,0,0,.2);color:var(--bodyText);font-size:14px;font-weight:400;position:absolute;top:100%;list-style:none;min-width:190px;padding:0;margin:0}.menu-box--static{position:static;max-width:190px}.menu-box :not(a),.menu-box [role*=button]{color:var(--bodyText)}.menu-box ul{margin:0;padding:0}.float-left .menu-box,.pull-left .menu-box,menu-box.anchor-left{inset-inline-start:0}.float-right .menu-box,.menu-box--anchor-right,.pull-right .menu-box{inset-inline-end:0}.menu-box .separator,.menu-box [role=separator],.menu-box hr{display:block;margin:0;padding:0;height:0;border:0;border-top:1px solid #ebebeb}.menu-box--border-separators>*{border-bottom:1px solid #ebebeb}.menu-box--border-separators>:last-child{border-bottom:0}.menu-box--border-separators>hr{display:none}.menu-box .sub,.menu-box [role*=button],.menu-box [role=box],.menu-box li{padding:10px;list-style:none;position:relative;line-height:1.4;clear:both;min-height:40px;display:block}.menu-box [role=box]{cursor:default}.menu-box [role*=button]{-webkit-padding-start:35px;padding-inline-start:35px;-webkit-border-start:2px solid transparent;border-inline-start:2px solid transparent;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-align:start}.menu-box--multiline [role*=button]{white-space:normal}.menu-box--noicons li:not([role=button]){-webkit-padding-start:0;padding-inline-start:0}.menu-box--noicons [role=button]{-webkit-padding-start:10px;padding-inline-start:10px;color:inherit}.menu-box [role=button]:hover{border-left-color:#a66bbe}.menu-box .disabled[role=button]{cursor:not-allowed;background:0 0;border-color:transparent!important;opacity:.5}.menu-box li.menu-box-sub{-webkit-padding-end:34px;padding-inline-end:34px}.menu-box .menu-box-sub>.sub,.menu-box .menu-box-sub>ul{display:none}.menu-box .menu-box-sub:hover>.sub,.menu-box .menu-box-sub:hover>ul{display:block}.menu-box [role*=button]>.icon,.menu-box li>.icon{font-size:16px;width:16px;height:16px;text-align:center;position:absolute;inset-inline-start:8px;top:50%;margin-top:-8px}.menu-box .menu-box-sub>.icon{inset-inline-start:auto;inset-inline-end:10px}.menu-box .menu-box-sub .sub,.menu-box .menu-box-sub ul{cursor:default;position:absolute;top:0;inset-inline-start:100%}.menu-box .meta{font-size:.93em;display:block}.menu-box .empty{font-size:1em;text-align:center;padding:40px 20px}.menu-box .empty>.icon{font-size:64px;margin-bottom:10px;display:block;color:#ebebeb;position:static}.arrow-navigator a{color:var(--colorAccent);display:block;text-decoration:none;text-align:center;height:40px;width:40px;position:absolute;top:50%;margin-top:-20px;opacity:.7;padding:10px}.arrow-navigator a.disabled{display:none}.arrow-navigator a:hover{opacity:1}.arrow-navigator a span{display:inline-block;font-size:20px;width:1em;height:1em;text-align:center}.growl{word-break:break-word;color:var(--alertText);font-size:1.1em;line-height:1.2;background:var(--alertBackground);padding:1em;-webkit-padding-end:2em;padding-inline-end:2em;text-align:center;overflow:visible;position:fixed;width:630px;inset-inline-start:50%;top:45px;z-index:9999;cursor:default;-webkit-border-start:5px solid var(--alertAccent);border-inline-start:5px solid var(--alertAccent);box-shadow:0 0 15px 5px rgba(0,0,0,.15);border-radius:4px;-webkit-margin-start:-315px;margin-inline-start:-315px}.growl:empty{display:none}.phone .growl{left:10px;right:10px;width:auto;-webkit-margin-start:auto;margin-inline-start:auto}.growl.static{-webkit-margin-start:auto;margin-inline-start:auto;position:static;-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:30px;padding-inline-end:30px;box-shadow:none;z-index:initial;margin:auto;width:auto}.growl.static.inline{margin:initial;text-align:start;display:inline-block;-webkit-padding-end:1em;padding-inline-end:1em;-webkit-padding-start:1em;padding-inline-start:1em}.growl .icon{font-size:14px;text-align:center;position:absolute;inset-inline-end:5px;top:7px;cursor:pointer;padding:10px;color:var(--alertText)}.growl-debug-message{text-align:start}.growl-debug-trace{overflow-x:auto;font-size:80%;margin-top:10px}.growl-debug-status{font-style:italic;margin-top:10px;margin-bottom:10px}#growl-placeholder{position:relative}#fullscreen-modal-box #growl-placeholder .growl{overflow:auto;text-align:start}.flex-center{margin:auto}.width-full{width:100%}.height-full{height:100%}.width-min-full{min-width:100%}.height-min-full{min-height:100%}.fullscreen{position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;overflow:auto;z-index:1000;opacity:0;transition:opacity 350ms linear}.fullscreen.black,.fullscreen.white{-webkit-backdrop-filter:blur(35px) saturate(1.8);backdrop-filter:blur(35px) saturate(1.8)}.black-bkg,.fullscreen.black{background:var(--backgroundDarkAlpha)}.fullscreen.white,.white-bkg{background:var(--backgroundLightAlpha)}.fullscreen.soft-white,.soft-white-bkg{background:rgba(255,255,255,.6)}.ie9 .fullscreen{-webkit-filter:none;filter:none}.fullscreen-loader{width:150px;height:150px;text-align:center;border-radius:10px;color:#fff;margin-top:-75px;-webkit-margin-start:-75px;margin-inline-start:-75px;position:absolute;top:50%;inset-inline-start:50%;zoom:1}.loading-txt{position:absolute;bottom:15px;inset-inline-start:0;text-align:center;width:100%}#fullscreen-modal{display:none}#fullscreen-modal.--show{display:grid;align-items:center}.ie9 #fullscreen-modal{-webkit-filter:none;filter:none}#fullscreen-modal-box{width:670px;margin:0 auto;padding:20px;position:relative;box-shadow:0 0 50px 6px rgba(0,0,0,.25);border-radius:10px;background:var(--modalBackground);color:var(--modalText)}.--has-scrollbar #fullscreen-modal-box{border-radius:0}.phone #fullscreen-modal-box{width:100%;margin:0;max-height:100%;-webkit-overflow-scrolling:touch;border-radius:0;padding:20px}#fullscreen-modal-box .modal-box-title,#fullscreen-modal-box h1{display:block;margin-top:0;margin-bottom:20px;font-size:20px;line-height:1.2;-webkit-padding-end:32px;padding-inline-end:32px}#fullscreen-modal-box h2{font-size:1.14em}#fullscreen-modal-box h2 *{font-weight:400}#fullscreen-modal-box .or-separator{margin-top:16px}#fullscreen-modal-box p{font-size:1em;line-height:160%;margin-top:10px;margin-bottom:10px}#fullscreen-modal-box p:firt-child{margin-top:0}#fullscreen-modal-box .btn-container{margin-bottom:0}#fullscreen-modal-box .close-modal.icon--close{position:absolute;inset-inline-end:10px;top:15px;cursor:pointer;display:block;padding:10px}.phone #fullscreen-modal-box .close-modal.icon--close,.phone #fullscreen-modal-box .close-modal.icon--close:hover{inset-inline-end:10px}.modal-form textarea{height:70px;resize:none}.fancy-box{padding:20px;background:var(--bodyBackground);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);border-radius:10px}.fancy-box p{-webkit-margin-before:1em;margin-block-start:1em;-webkit-margin-after:1em;margin-block-end:1em}.fancy-box .or-separator{height:1px;margin:0}#fullscreen-changes-confirm{background:var(--bodyBackground);padding:40px 0;margin-top:75px;position:absolute;text-align:center;top:50%;width:100%;box-shadow:0 4px 16px rgba(0,0,0,.25)}#fullscreen-changes-confirm h2{font-size:18px;line-height:18px;color:inherit}.fullscreen-viewer{background:#000;background:rgba(0,0,0,.9);color:#bbb;display:none}.fullscreen-viewer-top{height:50px;width:100%;background:#000}.fullscreen-viewer-navigation,.fullscreen-viewer-top-user{margin-top:8px}.fullscreen-viewer-top-user img{width:34px;height:34px;-webkit-margin-end:10px;margin-inline-end:10px}.fullscreen-viewer-navigation{font-size:16px;font-size:1.143rem;height:26px;position:relative;z-index:100}.fullscreen-viewer-navigation a{display:inline-block;color:#bbb;color:rgba(255,255,255,.7);text-decoration:none;padding:8px}.fullscreen-viewer-navigation a:hover{color:#fff}.fullscreen-viewer-navigation a.disabled{color:#bbb;color:rgba(255,255,255,.4);cursor:default}.fullscreen-viewer-content{text-align:center;height:100%;position:relative;display:none}.fullscreen-viewer-content img{max-width:100%;max-height:100%;box-shadow:0 0 6px 0 #000}#cookie-law-banner{position:fixed;padding:20px;width:100%;bottom:0;background:rgba(0,0,0,.8);color:#fff;font-size:1.2em;z-index:1000}#cookie-law-banner p{font-size:85%;-webkit-padding-end:20px;padding-inline-end:20px}a.cookie-law-close{color:inherit;text-decoration:none;position:absolute;inset-inline-end:0;top:0;opacity:.5}a.cookie-law-close:hover{opacity:1}.badge--paid{text-transform:uppercase;text-align:center;border-radius:3px;padding:2px 5px;display:inline-block;line-height:1;border:1px solid var(--buttonDefaultBorder);color:var(--buttonDefaultHoverText);background-color:var(--buttonDefaultHoverBackground);border-color:var(--buttonDefaultHoverBorder);font-weight:400}.pop-box-menu li .badge{position:absolute;inset-inline-end:8px;top:8px}.badge{vertical-align:text-bottom;font-size:.7143em;transform-origin:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.badge+label,.btn .badge{-webkit-margin-start:5px;margin-inline-start:5px}.pop-box-menu li.paid a{-webkit-padding-end:52px;padding-inline-end:52px}.r1{height:30px}.r2{height:70px}.r3{height:110px}.r4{height:150px}.r5{height:190px}.r6{height:230px}.r7{height:270px}.r8{height:310px}.r9{height:350px}.r10{height:390px}.r11{height:430px}.r12{height:470px}.r13{height:510px}.r14{height:550px}.r15{height:590px}.r16{height:630px}.r17{height:670px}.r18{height:710px}.r19{height:750px}.r20{height:790px}.r11{height:830px}.r22{height:870px}.r23{height:910px}.r24{height:950px}.columns-container{overflow:auto}.grid-columns{display:block;float:left}[dir=rtl] .grid-columns{float:right}.gutter-margin-right,.gutter-margin-right-bottom{-webkit-margin-end:1px;margin-inline-end:1px}.gutter-margin-bottom,.gutter-margin-left-bottom,.gutter-margin-right-bottom{margin-bottom:1px}.gutter-margin-left,.gutter-margin-left-bottom{-webkit-margin-start:1px;margin-inline-start:1px}.gutter-width{width:5px}.col-1-min{min-width:30px}.col-2-min{min-width:70px}.col-3-min{min-width:110px}.col-4-min{min-width:150px}.col-5-min{min-width:190px}.col-6-min{min-width:230px}.col-7-min{min-width:270px}.col-8-min{min-width:310px}.col-9-min{min-width:350px}.col-10-min{min-width:390px}.col-11-min{min-width:430px}.col-12-min{min-width:470px}.col-13-min{min-width:510px}.col-14-min{min-width:550px}.col-15-min{min-width:590px}.col-16-min{min-width:630px}.col-17-min{min-width:670px}.col-18-min{min-width:710px}.col-19-min{min-width:750px}.col-20-min{min-width:790px}.col-21-min{min-width:830px}.col-22-min{min-width:870px}.col-23-min{min-width:910px}.col-24-min{min-width:950px}.col-1-max{max-width:30px}.col-2-max{max-width:70px}.col-3-max{max-width:110px}.col-4-max{max-width:150px}.col-5-max{max-width:190px}.col-6-max{max-width:230px}.col-7-max{max-width:270px}.col-8-max{max-width:310px}.col-9-max{max-width:350px}.col-10-max{max-width:390px}.col-11-max{max-width:430px}.col-12-max{max-width:470px}.col-13-max{max-width:510px}.col-14-max{max-width:550px}.col-15-max{max-width:590px}.col-16-max{max-width:630px}.col-17-max{max-width:670px}.col-18-max{max-width:710px}.col-19-max{max-width:750px}.col-20-max{max-width:790px}.col-21-max{max-width:830px}.col-22-max{max-width:870px}.col-23-max{max-width:910px}.col-24-max{max-width:950px}@media (min-width:768px){.c1{width:30px}.c2{width:70px}.c3{width:110px}.c4{width:150px}.c5{width:190px}.c6{width:230px}.c7{width:270px}.c8{width:310px}.c9{width:350px}.c10{width:390px}.c11{width:430px}.c12{width:470px}.c13{width:510px}.c14{width:550px}.c15{width:590px}.c16{width:630px}.c17{width:670px}.c18{width:710px}.fluid-column.c1{width:3.157%}.fluid-column.c2{width:7.368%}.fluid-column.c3{width:11.578%}.fluid-column.c4{width:15.789%}.fluid-column.c5{width:20%}.fluid-column.c6{width:24.21%}.fluid-column.c7{width:28.421%}.fluid-column.c8{width:32.631%}.fluid-column.c9{width:36.842%}.fluid-column.c10{width:41.052%}.fluid-column.c11{width:45.263%}.fluid-column.c12{width:49.473%}.fluid-column.c13{width:53.684%}.fluid-column.c14{width:57.894%}.fluid-column.c15{width:62.105%}.fluid-column.c16{width:66.315%}.fluid-column.c17{width:70.526%}.fluid-column.c18{width:74.736%}}@media (min-width:992px){.content-width{width:100%;min-width:970px}.c19{width:750px}.c20{width:790px}.c21{width:830px}.c22{width:870px}.c23{width:910px}.c24{width:950px}.fluid-column.c19{width:78.947%}.fluid-column.c20{width:83.157%}.fluid-column.c21{width:87.368%}.fluid-column.c22{width:91.578%}.fluid-column.c23{width:95.789%}.fluid-column.c24{width:100%}.top-btn-text .btn-text{-webkit-margin-start:7px;margin-inline-start:7px}.pop-box .arrow-down{border-width:6px 6px 0 6px}}@media (min-width:992px) and (max-width:1920px){.content-width{max-width:1800px}}@media (min-width:1921px) and (max-width:2560px){.content-width{max-width:2440px}}@media (min-width:3840px){.content-width{max-width:3720px}}.color-body-text-subtle{color:var(--bodyTextSubtle)}.color-accent{color:var(--colorAccent)}.color-success{color:var(--colorSuccess)}.color-fail{color:var(--colorFail)}.color-white{color:#fff!important}.color-black{color:#333!important}.color-grey{color:#ccc!important}.color-green{color:#27ae61!important}.color-red{color:#e74c3c!important}.color-blue{color:var(--colorBlue)!important}.color-orange{color:#d35400!important}.color-purple{color:#8e44ad!important}.color-inherit{color:inherit!important}.color-initial{color:initial!important}.height-auto{height:auto}.width-auto{width:auto}.height-100p{height:100%}.width-100p{width:100%}.color-facebook{color:#3b5998}.color-twitter{color:#1da1f2}.color-google{color:#ea4335}.color-vk{color:#45668e}.border-color-facebook{border-color:#3b5998}.border-color-twitter{border-color:#1da1f2}.border-color-google{border-color:#ea4335}.border-color-vk{border-color:#45668e}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.background-black{background:#000!important}.background-white{background:#fff!important}.background-transparent{background:0 0!important}.background-gradient-white-left{background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,1) 35%,rgba(255,255,255,1) 100%)}.background-gradient-white-right{background:linear-gradient(to right,rgba(255,255,255,1) 0,rgba(255,255,255,1) 80%,rgba(255,255,255,0) 100%)}.font-weight-bold{font-weight:700!important}.font-weight-normal{font-weight:400!important}.cursor-pointer{cursor:pointer!important}.cursor-grab{cursor:-webkit-grab;cursor:grab}.cursor-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.cursor-default{cursor:default!important}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.font-size-small{font-size:13px;font-size:.92857143rem!important}.font-size-medium{font-size:medium!important}.font-size-large{font-size:large!important}.font-size-inherit{font-size:inherit!important}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.height-100p{height:100%!important}.height-120p{height:120%!important}.top-0{top:0}.top-10{top:10px}.top-20{top:20px}.top-30{top:30px}.top-40{top:40px}.right-0{inset-inline-end:0}.right-10{inset-inline-end:10px}.right-20{inset-inline-end:20px}.right-30{inset-inline-end:30px}.right-40{inset-inline-end:40px}.bottom-0{bottom:0}.bottom-10{bottom:10px}.bottom-20{bottom:20px}.bottom-30{bottom:30px}.bottom-40{bottom:40px}.left-0{inset-inline-start:0}.left-10{inset-inline-start:10px}.left-20{inset-inline-start:20px}.left-30{inset-inline-start:30px}.left-40{inset-inline-start:40px}.display-none{display:none}.display-none-forced{display:none!important}.display-block{display:block}.display-block-forced{display:block!important}.display-flex{display:-moz-flex;display:flex}.visibility-hidden{visibility:hidden}.clear-both{clear:both}.float-left{float:left}[dir=rtl] .float-left{float:right}.float-right{float:right}[dir=rtl] .float-right{float:left}.border-0,.no-border{border:none}.border-top-0{border-top:0}.border-right-0{-webkit-border-end:0;border-inline-end:0}.border-bottom-0{border-bottom:0}.border-left-0{-webkit-border-start:0;border-inline-start:0}.box-shadow-none{box-shadow:none}.word-break-break-all{word-break:break-all}.word-break-break-word{word-break:break-word}.margin-0{margin:0!important}.phone .phone-margin-0{margin:0!important}.margin-5{margin:5px!important}.margin-10{margin:10px!important}.margin-20{margin:20px!important}.margin-30{margin:20px!important}.margin-40{margin:20px!important}.margin-top-0,.phablet .phablet-margin-top-0,.phone .phone-margin-top-0{margin-top:0!important}.margin-top-5,.phablet .phablet-margin-top-5,.phone .phone-margin-top-5{margin-top:5px!important}.margin-top-10,.phablet .phablet-margin-top-10,.phone .phone-margin-top-10{margin-top:10px!important}.margin-top-20,.phablet .phablet-margin-top-20,.phone .phone-margin-top-20{margin-top:20px!important}.margin-top-30{margin-top:30px!important}.margin-top-40{margin-top:40px!important}.margin-right-auto{-webkit-margin-end:auto!important;margin-inline-end:auto!important}.margin-right-0,.phablet .phablet-margin-right-0,.phone .phone-margin-right-0{-webkit-margin-end:0!important;margin-inline-end:0!important}.margin-right-035em{-webkit-margin-end:.35em!important;margin-inline-end:.35em!important}.margin-right-5{-webkit-margin-end:5px!important;margin-inline-end:5px!important}.margin-right-10{-webkit-margin-end:10px!important;margin-inline-end:10px!important}.margin-right-20{-webkit-margin-end:20px!important;margin-inline-end:20px!important}.margin-right-30{-webkit-margin-end:30px!important;margin-inline-end:30px!important}.margin-right-40{-webkit-margin-end:40px!important;margin-inline-end:40px!important}.margin-bottom-0,.phablet .phablet-margin-bottom-0,.phone .phone-margin-bottom-0{margin-bottom:0!important}.margin-bottom-5{margin-bottom:5px!important}.margin-bottom-10,.phablet .phablet-margin-bottom-10,.phone .phone-margin-bottom-10{margin-bottom:10px!important}.margin-bottom-20,.phablet .phablet-margin-bottom-20,.phone .phone-margin-bottom-20{margin-bottom:20px!important}.margin-bottom-30{margin-bottom:30px!important}.margin-bottom-40{margin-bottom:40px!important}.margin-left-auto{-webkit-margin-start:auto!important;margin-inline-start:auto!important}.margin-left-0,.phablet .phablet-margin-left-0,.phone .phone-margin-left-0{-webkit-margin-start:0!important;margin-inline-start:0!important}.margin-right--10{-webkit-margin-end:-10px!important;margin-inline-end:-10px!important}.margin-left--10{-webkit-margin-start:-10px!important;margin-inline-start:-10px!important}.margin-left-5{-webkit-margin-start:5px!important;margin-inline-start:5px!important}.margin-left-10{-webkit-margin-start:10px!important;margin-inline-start:10px!important}.margin-left-20{-webkit-margin-start:20px!important;margin-inline-start:20px!important}.margin-left-30{-webkit-margin-start:30px!important;margin-inline-start:30px!important}.margin-left-40{-webkit-margin-start:40px!important;margin-inline-start:40px!important}.padding-0{padding:0!important}.phone .phone-padding-0{padding:0!important}.padding-5{padding:5px!important}.padding-10{padding:10px!important}.padding-20{padding:20px!important}.padding-30{padding:20px!important}.padding-40{padding:20px!important}.padding-top-5{padding-top:5px!important}.padding-top-0{padding-top:0!important}.padding-top-10{padding-top:10px!important}.padding-top-20{padding-top:20px!important}.padding-top-30{padding-top:30px!important}.padding-top-40{padding-top:40px!important}.padding-right-5{-webkit-padding-end:5px!important;padding-inline-end:5px!important}.padding-right-0{-webkit-padding-end:0!important;padding-inline-end:0!important}.padding-right-10{-webkit-padding-end:10px!important;padding-inline-end:10px!important}.padding-right-20{-webkit-padding-end:20px!important;padding-inline-end:20px!important}.padding-right-30{-webkit-padding-end:30px!important;padding-inline-end:30px!important}.padding-right-40{-webkit-padding-end:40px!important;padding-inline-end:40px!important}.padding-bottom-5{padding-bottom:5px!important}.padding-bottom-0{padding-bottom:0!important}.padding-bottom-10{padding-bottom:10px!important}.padding-bottom-20{padding-bottom:20px!important}.padding-bottom-30{padding-bottom:30px!important}.padding-bottom-40{padding-bottom:40px!important}.padding-left-5{-webkit-padding-start:5px!important;padding-inline-start:5px!important}.padding-left-0{-webkit-padding-start:0!important;padding-inline-start:0!important}.padding-left-10{-webkit-padding-start:10px!important;padding-inline-start:10px!important}.padding-left-20{-webkit-padding-start:20px!important;padding-inline-start:20px!important}.padding-left-30{-webkit-padding-start:30px!important;padding-inline-start:30px!important}.padding-left-40{-webkit-padding-start:40px!important;padding-inline-start:40px!important}.position-sticky{position:-webkit-sticky;position:sticky}.position-static{position:static}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.text-align-left{text-align:start}.text-align-center{text-align:center}.text-align-right{text-align:end}.text-align-justify{text-align:justify}.text-decoration-none{text-decoration:none!important}.display-block{display:block}.display-inline{display:inline}.display-inline-table{display:inline-table}.display-inline-block{display:inline-block}.display-table-cell{display:table-cell}.word-break-break-all{word-break:break-all}.list-style-position-inside li{list-style-position:inside!important}.list-style-position-outside li{list-style-position:outside!important}.list-style-type-disc li{list-style-type:disc!important}.list-style-type-decimal li{list-style-type:decimal!important}.center-box{-webkit-margin-end:auto!important;margin-inline-end:auto!important;-webkit-margin-start:auto!important;margin-inline-start:auto!important}.display-inline-block,.display-table-cell{zoom:1}.vertical-align-middle{vertical-align:middle!important}.resize-vertical{resize:vertical!important}.no-resize,.resize-none{resize:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-y-visible{overflow-y:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-scroll{overflow-y:scroll!important}.text-transform-capitalize{text-transform:capitalize}.text-transform-uppercase{text-transform:uppercase}.default-margin-top{margin-top:20px}.default-margin-bottom{margin-bottom:20px}.float-none{float:none!important;clear:both!important}.desktop .desktop-hide,.laptop .laptop-hide,.largescreen .desktop-hide,.phablet .phablet-hide,.phone .phone-hide,.tablet .tablet-hide{display:none!important}.desktop .desktop-display-block,.desktop .desktop-show,.laptop .laptop-display-block,.laptop .laptop-show,.largescreen .desktop-display-block,.largescreen .desktop-show,.phablet .phablet-display-block,.phablet .phablet-show,.phone .phone-display-block,.phone .phone-show,.tablet .tablet-display-block,.tablet .tablet-show{display:block!important}.desktop .desktop-display-inline,.laptop .laptop-display-inline,.phablet .phablet-display-inline,.phone .phone-display-inline,.tablet .tablet-display-inline{display:inline!important}.desktop .desktop-display-inline-block,.laptop .laptop-display-inline-block,.phablet .phablet-display-inline-block,.phone .phone-display-inline-block,.tablet .tablet-display-inline-block{display:inline-block!important}.image-responsive{max-width:100%!important;width:auto!important}.desktop .desktop-float-none,.laptop .laptop-float-none,.phablet .phablet-float-none,.phone .phone-float-none,.tablet .tablet-float-none{float:none;clear:both}.phablet .grid-columns,.phone .grid-columns{float:none;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}.phablet .phablet-float-left,.phone .phone-float-left{float:left!important}[dir=rtl].phablet .phablet-float-left,[dir=rtl].phone .phone-float-left{float:right!important}.phablet .phablet-c1,.phone .fluid-column.phablet-c1,.phone .fluid-column.phone-c1,.phone .phone-c1{width:100%}.phablet .phablet-text-align-left,.phone .phone-text-align-left{text-align:left!important}.phablet .phablet-text-align-center,.phone .phone-text-align-center{text-align:center!important}#tiptip_holder{display:none;position:absolute;top:0;inset-inline-start:0;z-index:99999}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_right{-webkit-padding-start:5px;padding-inline-start:5px}#tiptip_holder.tip_left{-webkit-padding-end:5px;padding-inline-end:5px}#tiptip_content{font-size:12px;color:#fff;padding:6px 8px;background-color:#333;background-color:rgba(0,0,0,.8);word-break:break-word}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-top-color:#333;border-top-color:rgba(0,0,0,.8)}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-7px;margin-inline-start:-7px;border-bottom-color:#333;border-bottom-color:rgba(0,0,0,.8)}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-right-color:#333;border-right-color:rgba(0,0,0,.8)}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;-webkit-margin-start:-6px;margin-inline-start:-6px;border-left-color:#333;border-left-color:rgba(0,0,0,.8)}.antiscroll-wrap{display:block;position:relative;overflow:hidden}.antiscroll-scrollbar{background:gray;background:rgba(0,0,0,.5);border-radius:7px;box-shadow:0 0 1px #fff;position:absolute;opacity:0;-webkit-transition:linear 350ms opacity;-moz-transition:linear 350ms opacity;-o-transition:linear 350ms opacity}.antiscroll-scrollbar-shown{opacity:1}.antiscroll-scrollbar-horizontal{height:7px;-webkit-margin-start:2px;margin-inline-start:2px;bottom:2px;inset-inline-start:0}.antiscroll-scrollbar-vertical{width:7px;margin-top:2px;inset-inline-end:2px;top:0}.antiscroll-inner{overflow:scroll}.antiscroll-inner::-webkit-scrollbar{width:0;height:0}.antiscroll-inner::scrollbar{width:0;height:0}#recaptcha_table.recaptcha_theme_clean #recaptcha_image{border:0!important}#recaptcha_response_field{height:auto}.copy-hover-display button.copy-input,.copy-hover-display button.input-action{visibility:hidden}.copy-hover-display:hover button.copy-input,.copy-hover-display:hover button.input-action,.phablet button.copy-input,.phablet button.input-action,.phone button.copy-input,.phone button.input-action{visibility:visible}button.copy-input,button.input-action{position:absolute;inset-inline-end:7px;top:.8181em;text-transform:uppercase;cursor:pointer;line-height:1;font-size:11px;padding:4px 6px;border-radius:4px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:0}button.copy-input,button.input-action{background:var(--buttonDefaultBackground);color:var(--buttonDefaultText)}button:hover.copy-input,button:hover.input-action{background:var(--buttonDefaultHoverBackground);color:var(--buttonDefaultHoverText)}.shake{-webkit-animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.key-feedback{line-height:1;background:rgba(0,0,0,.7);position:fixed;z-index:10000;-webkit-backdrop-filter:blur(30px);backdrop-filter:blur(30px);bottom:1.5em;transition:all .5s;opacity:0;text-align:center;color:#fff;font-weight:700;font-size:45px;padding:1em;border-radius:.5em;inset-inline-start:50%;transform:translateX(-50%);border:4px solid rgba(255,255,255,.9);box-shadow:0 0 50px 6px rgb(0 0 0 / 25%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img.qr{display:inline-block}.fa-vkontakte:before{content:"\f189"}.fab.fa-mailru{font-family:"Font Awesome 5 Free";font-weight:900}.fa-mailru:before{content:"\f1fa"}.fa-stackexchange:before{content:"\f18d"}.fa-twitchtv:before{content:"\f1e8"}.fa-wechat:before{content:"\f1d7"}.clearfix:after{clear:both;display:table;content:''} \ No newline at end of file diff --git a/content/legacy/themes/Peafowl/snippets/anywhere_upload.php b/content/legacy/themes/Peafowl/snippets/anywhere_upload.php index 497c0ae..d684a7d 100644 --- a/content/legacy/themes/Peafowl/snippets/anywhere_upload.php +++ b/content/legacy/themes/Peafowl/snippets/anywhere_upload.php @@ -19,13 +19,11 @@ if (!defined('ACCESS') || !ACCESS) { } if (Login::isLoggedUser()) { $user_albums = []; - if (Login::getUser()['album_count'] > 0) { - $user_albums = Handler::cond('owner') - && Handler::var('user_items_editor') !== null - && isset(Handler::var('user_items_editor')['user_albums']) - ? Handler::var('user_items_editor')['user_albums'] - : User::getAlbums(Login::getUser()); - } + $user_albums = Handler::cond('owner') + && Handler::var('user_items_editor') !== null + && isset(Handler::var('user_items_editor')['user_albums']) + ? Handler::var('user_items_editor')['user_albums'] + : User::getAlbums(Login::getUser()); } ?>
    @@ -164,16 +162,23 @@ if (Login::isLoggedUser()) {
    0) { + if (Login::isLoggedUser()) { + $isSelectedAlbum = Handler::var('album') !== [] && isset(Handler::var('album')['id_encoded']); ?>
    - +
    - ' . nl2br($GLOBALS['SMTPDebug']) . '

    '; - } ?> -
    + ' . nl2br($GLOBALS['SMTPDebug']) . '

    '; + } ?> +
    @@ -89,10 +110,225 @@ if (count($mailOptions) == 2 && (Handler::var('safe_post')
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    diff --git a/content/legacy/themes/Peafowl/views/dashboard/settings/homepage.php b/content/legacy/themes/Peafowl/views/dashboard/settings/homepage.php new file mode 100644 index 0000000..858ace8 --- /dev/null +++ b/content/legacy/themes/Peafowl/views/dashboard/settings/homepage.php @@ -0,0 +1,151 @@ + ' + . _s('These settings do not have any effect as "%s" is overriding / (root).', [ + '%s' => '' . _s('%s routing', _s('Single profile')) . '', + ]) + . '
    '; +} +echo read_the_docs_settings('homepage', _s('Homepage')); ?> +
    + +
    +
    +
    +
    +
    +
    + $v) { + $cover_index = $k + 1; + $cover_label = 'homepage_cover_image_' . $k; + $coverName = _s('Cover image') . ' (' . $cover_index . ')'; ?> +
    + +
    + 1) { + ?> + + +
    + +
    +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    >
    +
    +
    'page/welcome', '%l' => get_base_url('page/welcome')]); ?>
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +