From 697e7c97526fb7e7362793f502c9ec420c95963c Mon Sep 17 00:00:00 2001 From: ItsANameToo Date: Wed, 17 May 2023 12:29:41 +0200 Subject: [PATCH] chore: initial commit --- .editorconfig | 15 + .env.dusk | 47 + .env.example | 56 + .eslintrc.json | 19 + .gitattributes | 5 + .github/PULL_REQUEST_TEMPLATE.md | 30 + .github/labeler.yml | 23 + .github/workflows/ci.yml | 207 + .github/workflows/deps.yml | 87 + .github/workflows/label.yml | 19 + .github/workflows/ui.yml | 73 + .gitignore | 24 + .lintstagedrc.json | 3 + .prettierignore | 2 + .prettierrc | 6 + .svgo.js | 16 + .svgo.yml | 2 + CODEOWNERS | 1 + LICENSE | 621 + app/App/BaseApplication.php | 17 + .../CollaboratorPermissionsModal.php | 34 + .../Components/DeclineInvitationModal.php | 65 + .../Components/DeleteCollaborator.php | 69 + .../Components/InviteCollaborator.php | 52 + .../Components/LeaveTeamModal.php | 62 + .../Components/MailedInvitations.php | 43 + .../Components/ManageCollaborators.php | 31 + .../Components/UpdateCollaborator.php | 70 + .../Collaborator/Mail/InviteExistingUser.php | 51 + app/App/Collaborator/Mail/InviteNewUser.php | 32 + .../CollaboratorAcceptedInvite.php | 37 + .../CollaboratorDeclinedInvite.php | 37 + .../Commands/CheckRemoteServerExistence.php | 25 + .../Commands/IndexServerProviderImages.php | 25 + .../Commands/IndexServerProviderPlans.php | 25 + .../Commands/IndexServerProviderRegions.php | 25 + .../Jobs/MaintainServerProviderKey.php | 51 + app/App/Console/Commands/Jobs/PingServer.php | 56 + .../Commands/Jobs/RemoteServerExistence.php | 37 + .../Commands/Jobs/SyncServerRemoteAddress.php | 42 + .../Console/Commands/MaintainInvitations.php | 24 + .../Commands/MaintainServerProviderKeys.php | 25 + .../Console/Commands/PingRemoteServers.php | 25 + .../PurgeServersWithFailedDeployments.php | 44 + .../Console/Commands/RunPlaybookCommand.php | 147 + .../Commands/SyncServerRemoteAddresses.php | 27 + app/App/Console/Kernel.php | 112 + app/App/Console/Playbooks/BarePlaybook.php | 24 + app/App/Console/Playbooks/CoinPlaybook.php | 20 + .../DatabaseNotificationPlaybook.php | 17 + app/App/Console/Playbooks/DemoPlaybook.php | 124 + .../Console/Playbooks/DevelopmentPlaybook.php | 131 + .../Console/Playbooks/InvitationPlaybook.php | 17 + app/App/Console/Playbooks/NetworkPlaybook.php | 17 + .../Playbooks/NotificationPlaybook.php | 101 + app/App/Console/Playbooks/Playbook.php | 45 + .../Console/Playbooks/PlaybookDefinition.php | 45 + .../Playbooks/SecureShellKeyPlaybook.php | 17 + app/App/Console/Playbooks/ServerPlaybook.php | 48 + .../Playbooks/ServerProviderPlaybook.php | 20 + app/App/Console/Playbooks/TokenPlaybook.php | 23 + app/App/Console/Playbooks/UserPlaybook.php | 17 + app/App/Contracts/LogsActivity.php | 18 + app/App/Enums/ActivityDescriptionEnum.php | 14 + app/App/Enums/Constants.php | 10 + app/App/Enums/NetworkTypeEnum.php | 33 + app/App/Enums/ServerProviderTypeEnum.php | 38 + app/App/Exceptions/Handler.php | 59 + .../Http/Components/DownloadInstallScript.php | 61 + .../Http/Components/ManageWelcomeScreens.php | 44 + app/App/Http/Components/Modals/BetaNotice.php | 44 + app/App/Http/Components/UseDefaultsModal.php | 48 + app/App/Http/Kernel.php | 117 + app/App/Listeners/FlushMediaCache.php | 24 + app/App/Listeners/ListenForActivityLogs.php | 30 + app/App/Providers/AppServiceProvider.php | 100 + app/App/Providers/AuthServiceProvider.php | 30 + .../Providers/BroadcastServiceProvider.php | 21 + app/App/Providers/DuskServiceProvider.php | 20 + app/App/Providers/EventServiceProvider.php | 98 + app/App/Providers/HorizonServiceProvider.php | 26 + app/App/Providers/LivewireServiceProvider.php | 82 + app/App/Providers/RouteServiceProvider.php | 87 + app/App/Providers/ViewServiceProvider.php | 42 + .../Components/CreateSecureShellKey.php | 49 + .../Components/DeleteSecureShellKey.php | 51 + .../AddSecureShellKeyToServerProvider.php | 81 + ...RemoveSecureShellKeyFromServerProvider.php | 71 + app/App/Server/Components/CreateServer.php | 243 + app/App/Server/Components/DeleteServer.php | 77 + .../Components/DeleteServerProvider.php | 71 + .../Components/ManageServerConfiguration.php | 213 + .../Components/ManageServerProviders.php | 138 + .../RedirectOnServerProviderCompletion.php | 29 + app/App/Server/Components/RenameServer.php | 137 + .../Components/ServerDeploymentTracker.php | 181 + .../DeploymentStatusController.php | 58 + .../Server/Jobs/CreateServerOnProvider.php | 80 + .../Jobs/DestroyServerOnServerProvider.php | 55 + .../Server/Jobs/IndexServerProviderImages.php | 57 + .../Server/Jobs/IndexServerProviderPlans.php | 60 + .../Jobs/IndexServerProviderRegions.php | 57 + app/App/Server/Jobs/ProvisionServer.php | 62 + app/App/Server/Jobs/ProvisionUser.php | 44 + .../Server/Jobs/RemovePasswordsFromServer.php | 36 + app/App/Server/Jobs/ServerProvisioner.php | 72 + app/App/Server/Jobs/WaitForServerToStart.php | 62 + .../IndexServerProviderImagesFailed.php | 38 + .../IndexServerProviderPlansFailed.php | 38 + .../IndexServerProviderRegionsFailed.php | 38 + .../RemoteServerLimitReached.php | 44 + .../Server/Notifications/ServerDeleted.php | 47 + .../Server/Notifications/ServerDeployed.php | 39 + .../Notifications/ServerFailedDeployment.php | 56 + .../ServerFailedToCreateOnProvider.php | 56 + .../ServerProviderAuthenticationFailed.php | 47 + ...erProviderSecureShellKeyAdditionFailed.php | 43 + ...rverProviderSecureShellKeyLimitReached.php | 43 + ...verProviderSecureShellKeyRemovalFailed.php | 43 + ...ServerProviderSecureShellKeyUniqueness.php | 42 + .../ServerProviderServerRemovalFailed.php | 43 + .../Notifications/ServerProvisioned.php | 60 + .../Notifications/ServerUnreachable.php | 37 + .../Requests/StoreServerProviderRequest.php | 25 + app/App/Server/Resources/PlanResource.php | 26 + app/App/Server/Resources/RegionResource.php | 24 + app/App/Token/Components/ActiveServers.php | 210 + app/App/Token/Components/CreateTokenModal.php | 70 + app/App/Token/Components/DeleteToken.php | 123 + app/App/Token/Components/DeployBlockchain.php | 103 + app/App/Token/Components/LogoUpload.php | 93 + .../Components/ManageTokenSecureShellKeys.php | 144 + app/App/Token/Components/ManageTokens.php | 79 + app/App/Token/Components/UpdateToken.php | 46 + .../DeploymentConfigController.php | 36 + .../InstallationScriptController.php | 22 + .../Controllers/TokenActivityController.php | 41 + .../TokenCollaboratorController.php | 26 + app/App/Token/Controllers/TokenController.php | 36 + .../Controllers/TokenDetailsController.php | 24 + .../Controllers/TokenInvitationController.php | 72 + .../Controllers/TokenOnboardingController.php | 65 + .../TokenSecureShellKeyController.php | 27 + .../TokenServerActionController.php | 64 + .../TokenServerConfigurationController.php | 31 + .../Controllers/TokenServerController.php | 51 + .../TokenServerProviderController.php | 27 + app/App/Token/Notifications/TokenDeleted.php | 34 + .../Requests/DeploymentConfigRequest.php | 22 + .../User/Components/ManageSecureShellKeys.php | 24 + app/App/User/Components/UpdateUserAccount.php | 179 + app/App/User/Mail/ConfirmEmailChange.php | 41 + app/App/User/Mail/PersonalDataExport.php | 35 + app/App/View/Components/BlockchainLogo.php | 39 + app/App/View/Components/SortByButton.php | 25 + app/Domain/Coin/Models/Coin.php | 31 + .../Actions/InviteCollaboratorAction.php | 58 + .../Collaborator/Models/Collaborator.php | 37 + app/Domain/Collaborator/Models/Invitation.php | 45 + app/Domain/SecureShell/Contracts/Script.php | 36 + .../Contracts/SecureShellKeyGenerator.php | 14 + .../Contracts/ShellProcessRunner.php | 13 + .../Exceptions/SecureShellKeyAlreadyInUse.php | 12 + .../SecureShell/Facades/SecureShellKey.php | 21 + .../Facades/ShellProcessRunner.php | 20 + .../SecureShell/Models/SecureShellKey.php | 47 + .../Policies/SecureShellKeyPolicy.php | 19 + .../SecureShell/Rules/SecureShellKey.php | 43 + .../Scripts/Concerns/LocatesScript.php | 22 + .../Concerns/ManagesScriptVariables.php | 47 + .../SecureShell/Scripts/ManualScript.php | 56 + .../SecureShell/Scripts/ProvisionExplorer.php | 49 + .../SecureShell/Scripts/ProvisionForger.php | 53 + .../SecureShell/Scripts/ProvisionGenesis.php | 52 + .../SecureShell/Scripts/ProvisionRelay.php | 49 + .../SecureShell/Scripts/ProvisionSeed.php | 49 + .../SecureShell/Scripts/ProvisionUser.php | 53 + .../SecureShell/Services/SecureShell.php | 144 + .../Services/SecureShellCommand.php | 31 + .../SecureShell/Services/SecureShellKey.php | 63 + .../Services/ShellProcessRunner.php | 23 + .../SecureShell/Services/ShellResponse.php | 12 + .../Server/Contracts/ServerProviderClient.php | 168 + .../ServerProviderExceptionHandler.php | 10 + .../DTO/Casters/ImageCollectionCaster.php | 26 + .../DTO/Casters/PlanCollectionCaster.php | 26 + .../DTO/Casters/RegionCollectionCaster.php | 26 + app/Domain/Server/DTO/Image.php | 16 + app/Domain/Server/DTO/ImageCollection.php | 19 + app/Domain/Server/DTO/Plan.php | 28 + app/Domain/Server/DTO/PlanCollection.php | 19 + app/Domain/Server/DTO/Region.php | 16 + app/Domain/Server/DTO/RegionCollection.php | 19 + app/Domain/Server/DTO/SecureShellKey.php | 16 + app/Domain/Server/DTO/Server.php | 32 + app/Domain/Server/Enums/PresetTypeEnum.php | 43 + .../Server/Enums/ServerAttributeEnum.php | 20 + .../Server/Enums/ServerDeploymentStatus.php | 204 + .../Server/Enums/ServerTaskStatusEnum.php | 33 + .../Exceptions/ServerCoreLimitExceeded.php | 12 + .../Server/Exceptions/ServerLimitExceeded.php | 12 + .../Server/Exceptions/ServerNotFound.php | 12 + .../ServerProviderAuthenticationException.php | 12 + .../Server/Exceptions/ServerProviderError.php | 12 + ...rverProviderSecureShellKeyLimitReached.php | 12 + ...ServerProviderSecureShellKeyUniqueness.php | 12 + app/Domain/Server/Models/Server.php | 323 + app/Domain/Server/Models/ServerProvider.php | 79 + .../Server/Models/ServerProviderImage.php | 24 + .../Server/Models/ServerProviderPlan.php | 44 + .../Server/Models/ServerProviderRegion.php | 24 + app/Domain/Server/Models/ServerTask.php | 123 + app/Domain/Server/Policies/ServerPolicy.php | 60 + .../Server/Policies/ServerProviderPolicy.php | 40 + app/Domain/Server/Services/Providers/AWS.php | 367 + .../Providers/AWSExceptionHandler.php | 25 + .../Services/Providers/DigitalOcean.php | 392 + .../DigitalOceanExceptionHandler.php | 87 + .../Server/Services/Providers/Hetzner.php | 397 + .../Providers/HetznerExceptionHandler.php | 135 + .../Server/Services/Providers/Linode.php | 372 + .../Providers/LinodeExceptionHandler.php | 55 + .../Server/Services/Providers/Vultr.php | 375 + .../Providers/VultrExceptionHandler.php | 42 + .../Services/ServerProviderClientFactory.php | 30 + .../Support/Rules/ValidAWSServerName.php | 35 + .../Rules/ValidDigitalOceanServerName.php | 36 + .../Support/Rules/ValidHetznerServerName.php | 39 + .../Support/Rules/ValidLinodeServerName.php | 39 + .../Support/Rules/ValidVultrServerName.php | 36 + app/Domain/Status/Models/Activity.php | 21 + app/Domain/Status/Models/Status.php | 12 + app/Domain/Token/Enums/TokenAttributeEnum.php | 14 + .../Token/Enums/TokenOnboardingStatusEnum.php | 32 + app/Domain/Token/Enums/TokenStatusEnum.php | 17 + app/Domain/Token/Events/NetworkCreated.php | 41 + app/Domain/Token/Events/ServerCreated.php | 44 + app/Domain/Token/Events/ServerDeleted.php | 52 + .../Token/Events/ServerProviderCreated.php | 43 + .../Token/Events/ServerProviderDeleted.php | 43 + .../Token/Events/ServerProviderUpdated.php | 17 + app/Domain/Token/Events/ServerUpdating.php | 17 + app/Domain/Token/Events/TokenCreated.php | 41 + app/Domain/Token/Events/TokenDeleted.php | 42 + .../ServerCreated/CreateServerOnProvider.php | 25 + .../DestroyServerOnServerProvider.php | 28 + .../NotifyUsersOfServerDeletion.php | 36 + ...ForgetServerProviderTokenConfiguration.php | 33 + ...ecureShellKeyRemovalFromServerProvider.php | 23 + .../IndexServerProviderRelatedData.php | 33 + .../UpdateServerProviderName.php | 49 + .../TokenCreated/CreateDefaultNetworks.php | 27 + .../TokenDeleted/NotifyCollaborators.php | 23 + .../TokenDeleted/PurgeTokenResources.php | 19 + .../TokenDeleted/RemoveTokenNotifications.php | 16 + app/Domain/Token/Models/Network.php | 99 + app/Domain/Token/Models/Token.php | 324 + app/Domain/Token/Policies/TokenPolicy.php | 49 + app/Domain/Token/Rules/ReservedTokenName.php | 33 + .../Token/Rules/UniqueTokenExtraAttribute.php | 35 + .../User/Models/DatabaseNotification.php | 67 + app/Domain/User/Models/User.php | 179 + app/Domain/User/Observers/UserObserver.php | 32 + app/Support/AddressPrefixes.php | 79 + app/Support/Builders/NotificationBuilder.php | 100 + .../Components/Concerns/HasDefaultRender.php | 17 + .../Components/Concerns/HasFlashMessages.php | 19 + .../Concerns/InteractsWithPermissions.php | 22 + .../Concerns/InteractsWithToken.php | 18 + .../Components/Concerns/InteractsWithUser.php | 20 + .../Components/Concerns/ManagesToken.php | 384 + app/Support/Components/Concerns/Sortable.php | 29 + app/Support/Components/YoutubeModal.php | 37 + .../Concerns/HasSchemalessAttributes.php | 67 + app/Support/Eloquent/Model.php | 29 + app/Support/Helpers/Format.php | 32 + app/Support/Http/Controllers/Controller.php | 35 + app/Support/Http/Middleware/Authenticate.php | 25 + .../Http/Middleware/EncryptCookies.php | 18 + .../PreventRequestsDuringMaintenance.php | 19 + .../Middleware/RedirectIfAuthenticated.php | 30 + .../Http/Middleware/RedirectIfOnboarding.php | 24 + .../Middleware/ThrottleWithSessionToken.php | 50 + app/Support/Http/Middleware/TrimStrings.php | 20 + app/Support/Http/Middleware/TrustProxies.php | 29 + .../Http/Middleware/VerifyCsrfToken.php | 27 + app/Support/Rules/AddressPrefix.php | 21 + app/Support/Rules/BIP39Passphrase.php | 31 + app/Support/Rules/Port.php | 20 + app/Support/Services/ActivityLogger.php | 20 + app/Support/Services/Haiku.php | 217 + app/Support/Services/Json.php | 13 + app/Support/Services/OnboardingManager.php | 108 + app/Support/Services/PasswordGenerator.php | 15 + artisan | 53 + banner.png | Bin 0 -> 78911 bytes bootstrap/app.php | 59 + bootstrap/cache/.gitignore | 2 + composer.json | 125 + composer.lock | 17497 ++++++++++++++++ config/activitylog.php | 54 + config/app.php | 264 + config/auth.php | 119 + config/aws.php | 25 + config/backup.php | 233 + config/blade-icons.php | 198 + config/broadcasting.php | 57 + config/cache.php | 106 + config/cors.php | 36 + config/database.php | 143 + config/debugbar.php | 204 + config/deployer.php | 46 + config/filesystems.php | 111 + config/fortify.php | 133 + config/github.php | 87 + config/google2fa.php | 81 + config/hashing.php | 52 + config/hermes.php | 15 + config/horizon.php | 181 + config/livewire.php | 160 + config/logging.php | 94 + config/mail.php | 113 + config/model-status.php | 20 + config/personal-data-export.php | 36 + config/queue.php | 99 + config/responsecache.php | 73 + config/sentry.php | 15 + config/services.php | 39 + config/session.php | 199 + config/social.php | 17 + config/telescope.php | 154 + config/tracking.php | 10 + config/trustedproxy.php | 8 + config/view.php | 51 + config/web.php | 23 + database/.gitignore | 2 + database/factories/CoinFactory.php | 32 + .../factories/DatabaseNotificationFactory.php | 47 + database/factories/InvitationFactory.php | 43 + database/factories/NetworkFactory.php | 50 + database/factories/SecureShellKeyFactory.php | 52 + database/factories/ServerFactory.php | 133 + database/factories/ServerProviderFactory.php | 142 + .../factories/ServerProviderImageFactory.php | 83 + .../factories/ServerProviderPlanFactory.php | 91 + .../factories/ServerProviderRegionFactory.php | 83 + database/factories/ServerTaskFactory.php | 41 + database/factories/TokenFactory.php | 297 + database/factories/UserFactory.php | 47 + .../2014_10_12_000000_create_users_table.php | 38 + ...12_100000_create_password_resets_table.php | 30 + ..._add_two_factor_columns_to_users_table.php | 30 + ..._01_14_000000_create_failed_jobs_table.php | 37 + ...01_15_000000_create_activity_log_table.php | 40 + ...020_01_15_100000_create_statuses_table.php | 26 + .../2020_01_15_101832_create_coin_table.php | 36 + .../2020_01_16_000000_create_tokens_table.php | 49 + ...6_100000_create_server_providers_table.php | 92 + ...020_01_16_300000_create_networks_table.php | 31 + ...2020_01_16_400000_create_servers_table.php | 46 + ..._500000_create_secure_shell_keys_table.php | 37 + ..._01_17_100000_create_invitations_table.php | 39 + .../2020_01_22_052713_create_media_table.php | 45 + ...02_05_030355_create_server_tasks_table.php | 41 + ..._114046_create_token_secure_shell_keys.php | 35 + ...6_135202_add_uuid_to_failed_jobs_table.php | 34 + ...71258_add_last_login_at_to_users_table.php | 17 + ...1_17_000000_create_notifications_table.php | 25 + ...add_event_column_to_activity_log_table.php | 24 + ...atch_uuid_column_to_activity_log_table.php | 24 + ...ed_at_column_to_server_providers_table.php | 21 + database/seeders/DatabaseSeeder.php | 19 + docker-compose.yml | 48 + package.json | 37 + phpunit.sail.xml | 63 + phpunit.xml | 63 + psalm.xml | 23 + public/.htaccess | 21 + public/android-chrome-192x192.png | Bin 0 -> 9853 bytes public/android-chrome-512x512.png | Bin 0 -> 27491 bytes public/apple-touch-icon.png | Bin 0 -> 9127 bytes public/browserconfig.xml | 9 + public/css/app.css | 99 + public/favicon-16x16.png | Bin 0 -> 795 bytes public/favicon-32x32.png | Bin 0 -> 1349 bytes public/favicon.ico | Bin 0 -> 15086 bytes public/fonts/FiraMono-Bold.otf | Bin 0 -> 87644 bytes public/fonts/FiraMono-Regular.otf | Bin 0 -> 84600 bytes public/fonts/FiraMono-RegularItalic.otf | Bin 0 -> 94388 bytes public/images/ark-logo.svg | 1 + public/images/auth/verify-email.svg | 1 + public/images/bridgechain.svg | 1 + public/images/defaults/my-team.svg | 1 + .../defaults/no-notifications-navbar.svg | 1 + .../images/defaults/no-notifications-page.svg | 1 + public/images/defaults/no-notifications.svg | 1 + public/images/defaults/pending-invitation.svg | 1 + public/images/defaults/user.svg | 1 + public/images/home/basic.svg | 1 + public/images/home/customize.png | Bin 0 -> 36083 bytes public/images/home/deploy.png | Bin 0 -> 29656 bytes public/images/home/enterprise.svg | 1 + public/images/home/header.png | Bin 0 -> 29674 bytes public/images/home/manage.png | Bin 0 -> 35188 bytes public/images/home/premium.svg | 1 + public/images/installation_complete.svg | 1 + public/images/installation_failed.svg | 1 + public/images/logo.svg | 1 + public/images/mail/confirm.png | Bin 0 -> 8007 bytes public/images/mail/github.png | Bin 0 -> 526 bytes public/images/mail/invitation.png | Bin 0 -> 11974 bytes public/images/mail/logo.png | Bin 0 -> 930 bytes public/images/mail/personal-data.png | Bin 0 -> 7661 bytes public/images/mail/reset-password.png | Bin 0 -> 6654 bytes public/images/mail/server.png | Bin 0 -> 10555 bytes public/images/mail/twitter.png | Bin 0 -> 395 bytes public/images/mail/verify.png | Bin 0 -> 11394 bytes public/images/metadata.png | Bin 0 -> 69174 bytes public/images/modal/delete.svg | 1 + public/images/modal/email-change-confirm.svg | 1 + public/images/modal/email-change.svg | 1 + public/images/modal/expired-link.svg | 1 + public/images/modal/information.svg | 1 + public/images/modal/invalid-link.svg | 1 + public/images/modal/success.svg | 1 + public/images/modal/warning.svg | 1 + public/images/onboarding-footer.svg | 1 + public/images/onboarding.svg | 1 + public/images/server-providers/aws.svg | 1 + .../images/server-providers/digitalocean.svg | 1 + public/images/server-providers/hetnzer.svg | 1 + public/images/server-providers/hetzner.svg | 1 + public/images/server-providers/linode.svg | 1 + public/images/server-providers/vultr.svg | 1 + public/images/server/block-explorer.svg | 1 + public/images/server/github.svg | 1 + public/images/status.svg | 1 + public/images/support.svg | 1 + public/images/tokens.svg | 1 + .../vendor/ark/article/placeholder-banner.png | Bin 0 -> 37323 bytes .../images/vendor/ark/search/empty-dark.svg | 1 + public/images/vendor/ark/search/empty.svg | 1 + public/images/verified-email.svg | 1 + public/images/verify-email.svg | 1 + public/images/welcome/intro.svg | 1 + public/images/welcome/slide0.svg | 1 + public/images/welcome/slide1.svg | 1 + public/images/welcome/slide2.svg | 1 + public/images/welcome/slide3.svg | 1 + public/images/wizard/bitbucket.svg | 1 + public/images/wizard/github.svg | 1 + public/images/wizard/gitlab.svg | 1 + public/index.php | 58 + public/js/app.js | 2 + public/js/app.js.LICENSE | 5 + public/js/app.js.LICENSE.txt | 4 + public/js/clipboard.js | 1 + public/js/cookie-consent.js | 2 + public/js/cookie-consent.js.LICENSE.txt | 8 + public/js/crop-image.js | 2 + public/js/crop-image.js.LICENSE.txt | 9 + public/js/file-download.js | 1 + public/js/file-upload.js | 49 + public/js/manifest.js | 1 + public/js/swiper.js | 14 + public/js/swiper.min.js | 14 + public/js/vendor.js | 1 + public/js/vendor.js.LICENSE | 11 + public/main.js | 1 + public/manifest.js | 154 + public/mix-manifest.json | 77 + public/mstile-144x144.png | Bin 0 -> 3731 bytes public/mstile-150x150.png | Bin 0 -> 3714 bytes public/mstile-310x150.png | Bin 0 -> 4004 bytes public/mstile-310x310.png | Bin 0 -> 8542 bytes public/mstile-70x70.png | Bin 0 -> 2601 bytes public/robots.txt | 2 + public/safari-pinned-tab.svg | 1 + public/site.webmanifest | 19 + public/vendor.js | 14 + public/vendor/horizon/app-dark.css | 8 + public/vendor/horizon/app.css | 8 + public/vendor/horizon/app.js | 2 + public/vendor/horizon/img/favicon.png | Bin 0 -> 648 bytes public/vendor/horizon/img/horizon.svg | 1 + public/vendor/horizon/img/sprite.svg | 1 + public/vendor/horizon/mix-manifest.json | 8 + public/vendor/nova/app.css | 1 + public/vendor/nova/app.js | 1 + public/vendor/nova/manifest.js | 1 + public/vendor/nova/mix-manifest.json | 6 + public/vendor/nova/vendor.js | 1 + public/vendor/telescope/app-dark.css | 8 + public/vendor/telescope/app.css | 8 + public/vendor/telescope/app.js | 89 + public/vendor/telescope/favicon.ico | Bin 0 -> 26622 bytes public/vendor/telescope/mix-manifest.json | 5 + public/web.config | 28 + readme.md | 110 + rector.php | 14 + resources/css/_general.css | 230 + resources/css/_pagination.css | 41 + resources/css/_theme.css | 5 + resources/css/app.css | 20 + resources/fonts/FiraMono-Bold.otf | Bin 0 -> 87644 bytes resources/fonts/FiraMono-Regular.otf | Bin 0 -> 84600 bytes resources/fonts/FiraMono-RegularItalic.otf | Bin 0 -> 94388 bytes resources/icons/.gitkeep | 0 resources/icons/errors/401.svg | 1 + resources/icons/errors/403.svg | 1 + resources/icons/errors/404.svg | 1 + resources/icons/errors/419.svg | 1 + resources/icons/errors/429.svg | 1 + resources/icons/errors/500.svg | 1 + resources/icons/errors/503.svg | 1 + resources/icons/errors/generic.svg | 1 + resources/images/ark-logo.svg | 1 + resources/images/defaults/my-team.svg | 1 + .../defaults/no-notifications-navbar.svg | 1 + .../images/defaults/no-notifications-page.svg | 1 + resources/images/defaults/user.svg | 1 + resources/images/home/basic.svg | 1 + resources/images/home/customize.png | Bin 0 -> 36083 bytes resources/images/home/deploy.png | Bin 0 -> 29656 bytes resources/images/home/enterprise.svg | 1 + resources/images/home/header.png | Bin 0 -> 29674 bytes resources/images/home/manage.png | Bin 0 -> 35188 bytes resources/images/home/premium.svg | 1 + resources/images/installation_complete.svg | 1 + resources/images/installation_failed.svg | 1 + resources/images/logo.svg | 1 + resources/images/mail/confirm.png | Bin 0 -> 8007 bytes resources/images/mail/github.png | Bin 0 -> 526 bytes resources/images/mail/invitation.png | Bin 0 -> 11974 bytes resources/images/mail/logo.png | Bin 0 -> 930 bytes resources/images/mail/personal-data.png | Bin 0 -> 7661 bytes resources/images/mail/reset-password.png | Bin 0 -> 6654 bytes resources/images/mail/server.png | Bin 0 -> 10555 bytes resources/images/mail/twitter.png | Bin 0 -> 395 bytes resources/images/mail/verify.png | Bin 0 -> 11394 bytes resources/images/metadata.png | Bin 0 -> 69174 bytes resources/images/modal/delete.svg | 1 + .../images/modal/email-change-confirm.svg | 1 + resources/images/modal/email-change.svg | 1 + resources/images/modal/expired-link.svg | 1 + resources/images/modal/information.svg | 1 + resources/images/modal/invalid-link.svg | 1 + resources/images/modal/success.svg | 1 + resources/images/modal/warning.svg | 1 + resources/images/onboarding-footer.svg | 1 + resources/images/onboarding.svg | 1 + resources/images/server-providers/aws.svg | 1 + .../images/server-providers/digitalocean.svg | 1 + resources/images/server-providers/hetzner.svg | 1 + resources/images/server-providers/linode.svg | 1 + resources/images/server-providers/vultr.svg | 1 + resources/images/server/block-explorer.svg | 1 + resources/images/server/github.svg | 1 + resources/images/status.svg | 1 + resources/images/support.svg | 1 + resources/images/tokens.svg | 1 + .../vendor/ark/article/placeholder-banner.png | Bin 0 -> 37323 bytes .../images/vendor/ark/search/empty-dark.svg | 1 + resources/images/vendor/ark/search/empty.svg | 1 + resources/images/verified-email.svg | 1 + resources/images/verify-email.svg | 1 + resources/images/welcome/intro.svg | 1 + resources/images/welcome/slide0.svg | 1 + resources/images/welcome/slide1.svg | 1 + resources/images/welcome/slide2.svg | 1 + resources/images/welcome/slide3.svg | 1 + resources/images/wizard/bitbucket.svg | 1 + resources/images/wizard/github.svg | 1 + resources/images/wizard/gitlab.svg | 1 + resources/js/app.js | 26 + resources/js/file-download.js | 18 + resources/js/file-upload.js | 15 + .../js/vendor/ark/reposition-dropdown.js | 32 + resources/lang/en/actions.php | 101 + resources/lang/en/activity.php | 18 + resources/lang/en/auth.php | 54 + resources/lang/en/exceptions.php | 8 + resources/lang/en/forms.php | 163 + resources/lang/en/general.php | 11 + resources/lang/en/invitations.php | 12 + resources/lang/en/mails.php | 14 + resources/lang/en/menus.php | 66 + resources/lang/en/metatags.php | 54 + resources/lang/en/modals.php | 12 + resources/lang/en/notifications.php | 48 + resources/lang/en/pages.php | 453 + resources/lang/en/pagination.php | 19 + resources/lang/en/passwords.php | 26 + resources/lang/en/repository.php | 17 + resources/lang/en/scripts.php | 14 + resources/lang/en/shared.php | 9 + resources/lang/en/tables.php | 17 + resources/lang/en/tokens.php | 212 + resources/lang/en/tokens_blacklist.php | 933 + resources/lang/en/tooltips.php | 14 + resources/lang/en/urls.php | 15 + resources/lang/en/validation.php | 236 + resources/lang/vendor/nova/en.json | 407 + resources/lang/vendor/nova/en/validation.php | 19 + resources/views/app/cookie-policy.blade.php | 95 + resources/views/app/privacy-policy.blade.php | 446 + .../views/app/terms-of-service.blade.php | 158 + resources/views/app/tokens/activity.blade.php | 87 + .../views/app/tokens/collaborators.blade.php | 32 + .../app/tokens/configure/buttons.blade.php | 48 + .../views/app/tokens/configure/fees.blade.php | 74 + .../app/tokens/configure/general.blade.php | 105 + .../app/tokens/configure/network.blade.php | 71 + .../app/tokens/configure/review.blade.php | 199 + resources/views/app/tokens/details.blade.php | 148 + resources/views/app/tokens/edit.blade.php | 9 + resources/views/app/tokens/index.blade.php | 9 + resources/views/app/tokens/onboard.blade.php | 118 + .../app/tokens/secure-shell-keys.blade.php | 19 + .../app/tokens/server-configuration.blade.php | 13 + .../app/tokens/server-providers.blade.php | 13 + .../views/app/tokens/servers/create.blade.php | 8 + .../views/app/tokens/servers/index.blade.php | 13 + .../views/app/tokens/servers/show.blade.php | 7 + .../views/app/under-construction.blade.php | 1 + .../app/user/settings/notifications.blade.php | 9 + .../views/app/user/settings/profile.blade.php | 22 + .../app/user/settings/security.blade.php | 11 + .../app/user/settings/ssh-keys.blade.php | 9 + .../views/app/user/settings/teams.blade.php | 23 + resources/views/components/blank.blade.php | 3 + .../components/blockchain-logo.blade.php | 7 + .../views/components/delete-modal.blade.php | 61 + resources/views/components/divider.blade.php | 10 + resources/views/components/grid.blade.php | 14 + resources/views/components/griddy.blade.php | 13 + .../active-servers/action-dropdown.blade.php | 101 + .../active-servers/desktop-table.blade.php | 123 + .../active-servers/desktop-tabs.blade.php | 44 + .../active-servers/mobile-accordion.blade.php | 144 + .../active-servers/mobile-dropdown.blade.php | 64 + .../home/active-servers/type-filter.blade.php | 10 + .../modals/expired-link-modal.blade.php | 23 + .../modals/invalid-link-modal.blade.php | 23 + .../views/components/onboard-step.blade.php | 39 + .../components/pending-invitations.blade.php | 160 + .../components/profile/keys/desktop.blade.php | 47 + .../components/profile/keys/item.blade.php | 11 + .../components/profile/keys/mobile.blade.php | 32 + .../server-providers/desktop.blade.php | 52 + .../server-providers/item.blade.php | 11 + .../server-providers/mobile.blade.php | 35 + .../server-providers/select.blade.php | 61 + .../views/components/servers/status.blade.php | 21 + .../views/components/sort-by-button.blade.php | 11 + .../components/token-sidebar-links.blade.php | 51 + .../token-slider-placeholder.blade.php | 12 + .../views/components/token-slider.blade.php | 41 + .../components/tokens/details-item.blade.php | 9 + .../views/components/tokens/heading.blade.php | 16 + .../tokens/onboard-buttons.blade.php | 50 + .../tokens/sidebar-divider.blade.php | 1 + .../tokens/step-indicator.blade.php | 11 + .../components/tokens/subheading.blade.php | 36 + .../views/components/truncated-cell.blade.php | 6 + .../views/components/user-teams.blade.php | 154 + .../components/welcome-screens.blade.php | 147 + resources/views/layouts/app.blade.php | 84 + resources/views/layouts/server.blade.php | 45 + resources/views/layouts/token.blade.php | 67 + .../views/layouts/user-settings.blade.php | 29 + .../views/livewire/active-servers.blade.php | 80 + .../collaborator-permissions-modal.blade.php | 32 + .../create-secure-shell-key.blade.php | 15 + .../views/livewire/create-server.blade.php | 136 + .../livewire/create-token-modal.blade.php | 44 + .../decline-invitation-modal.blade.php | 39 + .../livewire/delete-collaborator.blade.php | 28 + .../delete-secure-shell-key.blade.php | 12 + .../livewire/delete-server-provider.blade.php | 65 + .../views/livewire/delete-server.blade.php | 28 + .../views/livewire/delete-token.blade.php | 69 + .../livewire/deploy-blockchain.blade.php | 54 + .../download-install-script.blade.php | 30 + .../livewire/invite-collaborator.blade.php | 47 + .../views/livewire/leave-team-modal.blade.php | 36 + .../views/livewire/logo-upload.blade.php | 23 + .../livewire/mailed-invitations.blade.php | 35 + .../livewire/manage-collaborators.blade.php | 243 + .../manage-secure-shell-keys.blade.php | 16 + .../manage-server-configuration.blade.php | 85 + .../manage-server-providers.blade.php | 143 + .../manage-token-secure-shell-keys.blade.php | 129 + .../views/livewire/manage-token.blade.php | 52 + .../views/livewire/manage-tokens.blade.php | 45 + .../livewire/manage-welcome-screens.blade.php | 5 + .../livewire/modals/beta-notice.blade.php | 54 + ...ct-on-server-provider-completion.blade.php | 4 + .../views/livewire/rename-server.blade.php | 31 + .../server-deployment-tracker.blade.php | 237 + .../livewire/update-collaborator.blade.php | 53 + .../livewire/update-user-account.blade.php | 132 + .../livewire/use-defaults-modal.blade.php | 20 + .../views/livewire/youtube-modal.blade.php | 25 + .../mails/confirm-email-change.blade.php | 202 + .../views/mails/email-verification.blade.php | 214 + .../mails/invite-existing-user.blade.php | 180 + .../views/mails/invite-new-user.blade.php | 196 + .../mails/personal-data-export.blade.php | 202 + .../views/mails/reset-password.blade.php | 211 + .../mails/server-failed-deployment.blade.php | 190 + .../views/mails/server-provisioned.blade.php | 190 + .../ark/ark/manual/check-config.blade.php | 15 + .../ark/manual/genesis/core/config.blade.php | 22 + .../genesis/core/install-core.blade.php | 5 + .../ark/ark/manual/pre-install.blade.php | 35 + .../pre-install/await-apt-unlock.blade.php | 7 + .../pre-install/configure-locale.blade.php | 31 + .../pre-install/deps-jemalloc.blade.php | 5 + .../manual/pre-install/deps-node.blade.php | 11 + .../ark/manual/pre-install/deps-ntp.blade.php | 9 + .../manual/pre-install/deps-pgsql.blade.php | 6 + .../ark/manual/pre-install/deps-pm2.blade.php | 9 + .../manual/pre-install/deps-program.blade.php | 10 + .../manual/pre-install/deps-system.blade.php | 8 + .../manual/pre-install/deps-yarn.blade.php | 9 + .../pre-install/detect-system.blade.php | 12 + .../manual/pre-install/export-paths.blade.php | 16 + .../pre-install/guard-against-root.blade.php | 7 + .../ark/manual/pre-install/helpers.blade.php | 10 + .../pre-install/update-system.blade.php | 9 + .../ark/manual/pre-install/visuals.blade.php | 109 + .../shared/configure-database.blade.php | 50 + .../ark/manual/shared/create-alias.blade.php | 5 + .../ark/ark/provision-explorer.blade.php | 22 + .../ark/ark/provision-forger.blade.php | 22 + .../ark/ark/provision-genesis.blade.php | 27 + .../ark/ark/provision-manual.blade.php | 15 + .../scripts/ark/ark/provision-relay.blade.php | 20 + .../scripts/ark/ark/provision-seed.blade.php | 19 + .../scripts/ark/ark/provision-user.blade.php | 46 + .../ark/ark/provision/arkscan/build.blade.php | 45 + .../ark/ark/provision/arkscan/clone.blade.php | 12 + .../ark/provision/arkscan/config.blade.php | 48 + .../ark/provision/arkscan/install.blade.php | 14 + .../arkscan/start-processes.blade.php | 3 + .../ark/provision/forger/configure.blade.php | 9 + .../forger/start-processes.blade.php | 5 + .../provision/genesis/core/config.blade.php | 55 + .../genesis/core/install-core.blade.php | 3 + .../genesis/core/print-passphrases.blade.php | 17 + .../genesis/core/store-config.blade.php | 18 + .../genesis/start-processes.blade.php | 4 + .../ark/ark/provision/post-install.blade.php | 7 + .../ark/ark/provision/pre-install.blade.php | 45 + .../accept-github-remote.blade.php | 3 + .../pre-install/await-apt-unlock.blade.php | 7 + .../pre-install/configure-locale.blade.php | 33 + .../pre-install/deps-docker.blade.php | 49 + .../pre-install/deps-jemalloc.blade.php | 7 + .../provision/pre-install/deps-node.blade.php | 13 + .../provision/pre-install/deps-ntp.blade.php | 11 + .../pre-install/deps-pgsql.blade.php | 8 + .../provision/pre-install/deps-pm2.blade.php | 11 + .../pre-install/deps-program.blade.php | 12 + .../pre-install/deps-system.blade.php | 10 + .../provision/pre-install/deps-yarn.blade.php | 11 + .../pre-install/detect-system.blade.php | 13 + .../pre-install/export-paths.blade.php | 16 + .../pre-install/guard-against-root.blade.php | 7 + .../provision/pre-install/helpers.blade.php | 49 + .../pre-install/secure-server.blade.php | 59 + .../unattended-security-upgrades.blade.php | 15 + .../pre-install/update-system.blade.php | 11 + .../provision/pre-install/visuals.blade.php | 109 + .../provision/relay/start-processes.blade.php | 3 + .../provision/seed/start-processes.blade.php | 3 + .../shared/configure-database.blade.php | 20 + .../provision/shared/create-alias.blade.php | 7 + .../shared/create-boot-script.blade.php | 7 + .../provision/shared/fetch-config.blade.php | 23 + resources/views/shared/flash.blade.php | 3 + .../vendor/ark-fortify/auth/login.blade.php | 102 + .../views/vendor/ark/pagination-url.blade.php | 185 + .../views/vendor/ark/pagination.blade.php | 159 + .../hermes/navbar-notifications.blade.php | 72 + routes/api.php | 14 + routes/channels.php | 20 + routes/console.php | 21 + routes/web.php | 126 + server.php | 19 + storage/app/.gitignore | 3 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/token-config/.gitignore | 2 + tailwind.config.js | 32 + tests/Analysis/AnalysisTest.php | 36 + .../CollaboratorPermissionsModalTest.php | 23 + .../Components/DeclineInvitationModalTest.php | 97 + .../Components/DeleteCollaboratorTest.php | 85 + .../Components/InviteCollaboratorTest.php | 140 + .../Components/LeaveTeamModalTest.php | 80 + .../Components/MailedInvitationsTest.php | 57 + .../Components/ManageCollaboratorsTest.php | 41 + .../Components/UpdateCollaboratorTest.php | 54 + .../Mail/InviteExistingUserTest.php | 73 + .../Collaborator/Mail/InviteNewUserTest.php | 26 + .../CollaboratorAcceptedInviteTest.php | 63 + .../CollaboratorDeclinedInviteTest.php | 63 + .../CheckRemoteServerExistenceTest.php | 15 + .../IndexServerProviderImagesTest.php | 15 + .../Commands/IndexServerProviderPlansTest.php | 15 + .../IndexServerProviderRegionsTest.php | 15 + .../Jobs/MaintainServerProviderKeyTest.php | 57 + .../Console/Commands/Jobs/PingServerTest.php | 81 + .../Jobs/RemoteServerExistenceTest.php | 96 + .../Jobs/SyncServerRemoteAddressTest.php | 37 + .../Commands/MaintainInvitationsTest.php | 23 + .../MaintainServerProviderKeysTest.php | 15 + .../Commands/PingRemoteServersTest.php | 15 + .../PurgeServersWithFailedDeploymentsTest.php | 109 + .../SyncServerRemoteAddressesTest.php | 23 + tests/App/Enums/NetworkTypeEnumTest.php | 17 + .../App/Enums/ServerProviderTypeEnumTest.php | 29 + .../Components/DownloadInstallScriptTest.php | 64 + .../Components/ManageWelcomeScreensTest.php | 55 + .../Http/Components/Modals/BetaNoticeTest.php | 45 + .../Http/Components/UseDefaultsModalTest.php | 36 + tests/App/Listeners/FlushMediaCacheTest.php | 26 + .../Components/CreateSecureShellKeyTest.php | 100 + .../Components/DeleteSecureShellKeyTest.php | 52 + .../AddSecureShellKeyToServerProviderTest.php | 102 + ...veSecureShellKeyFromServerProviderTest.php | 103 + .../Server/Components/CreateServerTest.php | 748 + .../Components/DeleteServerProviderTest.php | 211 + .../Server/Components/DeleteServerTest.php | 148 + .../ManageServerConfigurationTest.php | 599 + .../Components/ManageServerProvidersTest.php | 185 + ...RedirectOnServerProviderCompletionTest.php | 48 + .../Server/Components/RenameServerTest.php | 221 + .../ServerDeploymentTrackerTest.php | 205 + .../DeploymentStatusControllerTest.php | 80 + .../Jobs/CreateServerOnProviderTest.php | 255 + .../DestroyServerOnServerProviderTest.php | 170 + .../Jobs/IndexServerProviderImagesTest.php | 82 + .../Jobs/IndexServerProviderPlansTest.php | 82 + .../Jobs/IndexServerProviderRegionsTest.php | 82 + tests/App/Server/Jobs/ProvisionServerTest.php | 72 + tests/App/Server/Jobs/ProvisionUserTest.php | 53 + .../Jobs/RemovePasswordsFromServerTest.php | 29 + .../App/Server/Jobs/ServerProvisionerTest.php | 82 + .../Server/Jobs/WaitForServerToStartTest.php | 78 + .../IndexServerProviderImagesFailedTest.php | 44 + .../IndexServerProviderPlansFailedTest.php | 44 + .../IndexServerProviderRegionsFailedTest.php | 44 + .../RemoteServerLimitReachedTest.php | 58 + .../Notifications/ServerDeletedTest.php | 59 + .../Notifications/ServerDeployedTest.php | 57 + .../ServerFailedDeploymentTest.php | 110 + .../ServerFailedToCreateOnProviderTest.php | 58 + ...ServerProviderAuthenticationFailedTest.php | 59 + ...oviderSecureShellKeyAdditionFailedTest.php | 59 + ...ProviderSecureShellKeyLimitReachedTest.php | 59 + ...roviderSecureShellKeyRemovalFailedTest.php | 59 + ...erProviderSecureShellKeyUniquenessTest.php | 59 + .../ServerProviderServerRemovalFailedTest.php | 58 + .../Notifications/ServerProvisionedTest.php | 94 + .../Notifications/ServerUnreachableTest.php | 44 + .../Requests/DeploymentConfigRequestTest.php | 68 + .../StoreServerProviderRequestTest.php | 145 + .../App/Server/Resources/PlanResourceTest.php | 39 + .../Server/Resources/RegionResourceTest.php | 33 + .../Token/Components/ActiveServersTest.php | 524 + .../Token/Components/CreateTokenModalTest.php | 104 + .../App/Token/Components/DeleteTokenTest.php | 333 + .../Token/Components/DeployBlockchainTest.php | 201 + tests/App/Token/Components/LogoUploadTest.php | 123 + .../ManageTokenSecureShellKeysTest.php | 544 + .../App/Token/Components/ManageTokensTest.php | 165 + .../App/Token/Components/UpdateTokenTest.php | 463 + .../DeploymentConfigControllerTest.php | 57 + .../InstallationScriptControllerTest.php | 27 + .../TokenActivityControllerTest.php | 25 + .../TokenCollaboratorControllerTest.php | 52 + .../Token/Controllers/TokenControllerTest.php | 99 + .../TokenDetailsControllerTest.php | 39 + .../TokenInvitationControllerTest.php | 80 + .../TokenOnboardingControllerTest.php | 103 + .../TokenSecureShellKeyControllerTest.php | 56 + .../TokenServerActionControllerTest.php | 90 + ...TokenServerConfigurationControllerTest.php | 55 + .../Controllers/TokenServerControllerTest.php | 71 + .../TokenServerProviderControllerTest.php | 59 + .../Token/Notifications/TokenDeletedTest.php | 44 + .../Components/ManageSecureShellKeysTest.php | 15 + .../User/Components/UpdateUserAccountTest.php | 523 + .../App/User/Mail/ConfirmEmailChangeTest.php | 15 + .../App/User/Mail/PersonalDataExportTest.php | 21 + .../App/View/Components/SortByButtonTest.php | 63 + tests/Browser/Components/Crop.php | 38 + tests/Browser/LoginTest.php | 41 + tests/Browser/OnboardingStepsTest.php | 50 + tests/Browser/Pages/HomePage.php | 44 + tests/Browser/Pages/Page.php | 22 + tests/Browser/RegisterTest.php | 57 + tests/Browser/SelectSshKeysTest.php | 81 + tests/Browser/ServerConfigurationTest.php | 46 + tests/Browser/SetServerProviderTest.php | 39 + tests/Browser/TokenEditTest.php | 258 + tests/Browser/console/.gitignore | 2 + tests/Browser/screenshots/.gitignore | 2 + tests/Concerns/CreatesModels.php | 29 + tests/CreatesApplication.php | 24 + tests/Domain/Coin/Models/CoinTest.php | 26 + .../Actions/InviteCollaboratorActionTest.php | 68 + .../Collaborator/Models/CollaboratorTest.php | 9 + .../Collaborator/Models/InvitationTest.php | 48 + .../SecureShell/Models/SecureShellKeyTest.php | 41 + .../Policies/SecureShellKeyPolicyTest.php | 13 + .../SecureShell/Rules/SecureShellKeyTest.php | 31 + .../Scripts/Concerns/LocatestScriptTest.php | 20 + .../SecureShell/Scripts/ManualScriptTest.php | 28 + .../Scripts/ProvisionExplorerTest.php | 23 + .../Scripts/ProvisionForgerTest.php | 23 + .../Scripts/ProvisionGenesisTest.php | 28 + .../Scripts/ProvisionRelayTest.php | 23 + .../SecureShell/Scripts/ProvisionSeedTest.php | 23 + .../SecureShell/Scripts/ProvisionUserTest.php | 17 + .../Services/Concerns/GetCurrentDirectory.php | 30 + .../Concerns/ScriptWithUserSwitch.php | 30 + .../Services/SecureShellCommandTest.php | 15 + .../Services/SecureShellKeyTest.php | 21 + .../SecureShell/Services/SecureShellTest.php | 70 + .../Services/ShellProcessRunnerTest.php | 26 + .../Services/ShellResponseTest.php | 13 + .../Server/Enums/PresetTypeEnumTest.php | 13 + .../Enums/ServerDeploymentStatusTest.php | 93 + .../Server/Enums/ServerTaskStatusEnumTest.php | 13 + .../Server/Models/ServerProviderImageTest.php | 15 + .../Server/Models/ServerProviderPlanTest.php | 27 + .../Models/ServerProviderRegionTest.php | 15 + .../Server/Models/ServerProviderTest.php | 109 + tests/Domain/Server/Models/ServerTaskTest.php | 141 + tests/Domain/Server/Models/ServerTest.php | 312 + .../Server/Policies/ServerPolicyTest.php | 64 + .../Policies/ServerProviderPolicyTest.php | 41 + .../Providers/AWSExceptionHandlerTest.php | 13 + .../DigitalOceanExceptionHandlerTest.php | 58 + .../Services/Providers/DigitalOceanTest.php | 410 + .../Providers/HetznerExceptionHandlerTest.php | 89 + .../Server/Services/Providers/HetznerTest.php | 416 + .../Providers/LinodeExceptionHandlerTest.php | 31 + .../Server/Services/Providers/LinodeTest.php | 350 + .../Providers/VultrExceptionHandlerTest.php | 22 + .../Server/Services/Providers/VultrTest.php | 340 + .../ServerProviderClientFactoryTest.php | 50 + .../Support/Rules/ValidAWSServerNameTest.php | 18 + .../Rules/ValidDigitalOceanServerNameTest.php | 23 + .../Rules/ValidHetznerServerNameTest.php | 58 + .../Rules/ValidLinodeServerNametTest.php | 74 + .../Rules/ValidVultrServerNameTest.php | 18 + .../Token/Enums/TokenStatusEnumTest.php | 10 + .../Token/Events/NetworkCreatedTest.php | 24 + .../Domain/Token/Events/ServerCreatedTest.php | 36 + .../Domain/Token/Events/ServerDeletedTest.php | 38 + .../Events/ServerProviderCreatedTest.php | 25 + .../Events/ServerProviderDeletedTest.php | 25 + .../Events/ServerProviderUpdatedTest.php | 17 + .../Domain/Token/Events/TokenCreatedTest.php | 37 + .../Domain/Token/Events/TokenDeletedTest.php | 39 + .../CreateServerOnProviderTest.php | 16 + .../DestroyServerOnServerProviderTest.php | 30 + .../NotifyUsersOfServerDeletionTest.php | 159 + .../IndexServerProviderRelatedDataTest.php | 36 + .../UpdateServerProviderNameTest.php | 127 + .../CreateDefaultNetworksTest.php | 31 + .../TokenDeleted/NotifyCollaboratorsTest.php | 39 + .../TokenDeleted/PurgeTokenResourcesTest.php | 61 + ...emoveActionsFromTokenNotificationsTest.php | 41 + tests/Domain/Token/Models/NetworkTest.php | 113 + tests/Domain/Token/Models/TokenTest.php | 390 + .../Domain/Token/Policies/TokenPolicyTest.php | 34 + .../Rules/UniqueTokenExtraAttributeTest.php | 31 + .../User/Models/DatabaseNotificationTest.php | 57 + tests/Domain/User/Models/UserTest.php | 207 + .../User/Observers/UserObserverTest.php | 42 + tests/DuskTestCase.php | 154 + tests/Helpers.php | 24 + tests/Pest.php | 8 + tests/Plugins/Encryption/FakeEncrypter.php | 89 + tests/Support/AddressPrefixesTest.php | 14 + .../Builders/NotificationBuilderTest.php | 106 + .../Support/Components/YoutubeModalsTest.php | 27 + tests/Support/Helpers/FormatTest.php | 33 + .../Http/Middleware/AuthenticateTest.php | 31 + .../RedirectIfAuthenticatedTest.php | 23 + .../Middleware/RedirectIfOnboardingTest.php | 40 + .../ThrottleWithSessionTokenTest.php | 15 + tests/Support/Rules/AddressPrefixTest.php | 23 + tests/Support/Rules/BIP39PassphraseTest.php | 23 + tests/Support/Rules/PortTest.php | 26 + tests/Support/Services/ActivityLoggerTest.php | 97 + tests/Support/Services/HaikuTest.php | 13 + tests/Support/Services/JsonTest.php | 15 + .../Services/OnboardingManagerTest.php | 247 + .../Services/PasswordGeneratorTest.php | 9 + tests/TestCase.php | 122 + tests/bootstrap.php | 29 + tests/fixtures/ark/syncing.json | 8 + tests/fixtures/avatar.jpg | Bin 0 -> 74258 bytes tests/fixtures/bitbucket/keys.json | 32 + tests/fixtures/bitbucket/repo-exists.json | 7 + tests/fixtures/bitbucket/repo.json | 86 + tests/fixtures/bitbucket/user.json | 23 + tests/fixtures/config.json | 56 + tests/fixtures/crypto/genesis-block.json | 108 + .../crypto/genesis-delegate-registration.json | 17 + tests/fixtures/crypto/genesis-transfer.json | 14 + tests/fixtures/crypto/wallet.json | 8 + tests/fixtures/details.json | 8 + tests/fixtures/digitalocean/account.json | 11 + .../digitalocean/create-exceeded.json | 4 + tests/fixtures/digitalocean/create.json | 74 + .../digitalocean/errored-general.json | 7 + tests/fixtures/digitalocean/images.json | 29 + tests/fixtures/digitalocean/plans.json | 228 + tests/fixtures/digitalocean/reboot.json | 44 + tests/fixtures/digitalocean/regions.json | 176 + tests/fixtures/digitalocean/rename.json | 44 + .../digitalocean/server-not-found.json | 4 + tests/fixtures/digitalocean/server.json | 76 + .../digitalocean/ssh-key-create-failed.json | 4 + .../digitalocean/ssh-keys-create.json | 8 + tests/fixtures/digitalocean/ssh-keys-get.json | 8 + tests/fixtures/digitalocean/start.json | 44 + tests/fixtures/digitalocean/stop.json | 44 + .../digitalocean/too-many-requests.json | 4 + tests/fixtures/digitalocean/unauthorized.json | 4 + tests/fixtures/github/create-branch.json | 10 + .../fixtures/github/create-pull-request.json | 512 + tests/fixtures/github/get-branch.json | 10 + tests/fixtures/github/get-file.json | 18 + tests/fixtures/github/keys.json | 9 + tests/fixtures/github/repo-exists.json | 12 + tests/fixtures/github/repo.json | 105 + tests/fixtures/github/update-file.json | 52 + tests/fixtures/github/update-repository.json | 337 + tests/fixtures/github/user.json | 45 + tests/fixtures/gitlab/create-branch.json | 22 + .../fixtures/gitlab/create-pull-request.json | 105 + tests/fixtures/gitlab/get-branch.json | 22 + tests/fixtures/gitlab/get-file.json | 12 + tests/fixtures/gitlab/keys.json | 6 + tests/fixtures/gitlab/repo-exists.json | 7 + tests/fixtures/gitlab/repo.json | 130 + tests/fixtures/gitlab/update-file.json | 4 + tests/fixtures/gitlab/user.json | 35 + .../fixtures/hetzner/core-limit-exceeded.json | 9 + tests/fixtures/hetzner/create-exceeded.json | 6 + tests/fixtures/hetzner/create.json | 159 + tests/fixtures/hetzner/delete.json | 20 + tests/fixtures/hetzner/errored-general.json | 11 + .../fixtures/hetzner/images-without-name.json | 51 + tests/fixtures/hetzner/images.json | 27 + .../fixtures/hetzner/method-not-allowed.json | 7 + tests/fixtures/hetzner/plans.json | 28 + tests/fixtures/hetzner/reboot.json | 20 + tests/fixtures/hetzner/regions.json | 14 + tests/fixtures/hetzner/rename.json | 136 + tests/fixtures/hetzner/server-not-found.json | 7 + tests/fixtures/hetzner/server.json | 121 + tests/fixtures/hetzner/ssh-keys-create.json | 10 + tests/fixtures/hetzner/ssh-keys-get.json | 10 + .../hetzner/ssh-keys-uniqueness-error.json | 11 + tests/fixtures/hetzner/start.json | 20 + tests/fixtures/hetzner/stop.json | 20 + .../hetzner/unable-to-authenticate.json | 7 + tests/fixtures/linode/account.json | 21 + tests/fixtures/linode/create-exceeded.json | 7 + tests/fixtures/linode/create.json | 37 + tests/fixtures/linode/images.json | 21 + tests/fixtures/linode/plans.json | 357 + tests/fixtures/linode/regions.json | 68 + tests/fixtures/linode/server-not-found.json | 7 + tests/fixtures/linode/server.json | 37 + tests/fixtures/linode/ssh-keys-create.json | 6 + tests/fixtures/linode/ssh-keys-get.json | 6 + tests/fixtures/linode/update.json | 37 + tests/fixtures/vultr/account.json | 6 + tests/fixtures/vultr/create-exceeded.json | 4 + tests/fixtures/vultr/create.json | 3 + tests/fixtures/vultr/images.json | 23 + tests/fixtures/vultr/plans.json | 27 + tests/fixtures/vultr/regions.json | 22 + tests/fixtures/vultr/server-not-found.json | 1 + tests/fixtures/vultr/server.json | 42 + tests/fixtures/vultr/ssh-keys-create.json | 3 + tests/fixtures/vultr/ssh-keys-get.json | 8 + webpack.mix.js | 42 + yarn.lock | 5898 ++++++ 1105 files changed, 81586 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.dusk create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .gitattributes create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/deps.yml create mode 100644 .github/workflows/label.yml create mode 100644 .github/workflows/ui.yml create mode 100644 .gitignore create mode 100644 .lintstagedrc.json create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .svgo.js create mode 100644 .svgo.yml create mode 100644 CODEOWNERS create mode 100644 LICENSE create mode 100644 app/App/BaseApplication.php create mode 100644 app/App/Collaborator/Components/CollaboratorPermissionsModal.php create mode 100644 app/App/Collaborator/Components/DeclineInvitationModal.php create mode 100644 app/App/Collaborator/Components/DeleteCollaborator.php create mode 100644 app/App/Collaborator/Components/InviteCollaborator.php create mode 100644 app/App/Collaborator/Components/LeaveTeamModal.php create mode 100644 app/App/Collaborator/Components/MailedInvitations.php create mode 100644 app/App/Collaborator/Components/ManageCollaborators.php create mode 100644 app/App/Collaborator/Components/UpdateCollaborator.php create mode 100644 app/App/Collaborator/Mail/InviteExistingUser.php create mode 100644 app/App/Collaborator/Mail/InviteNewUser.php create mode 100644 app/App/Collaborator/Notifications/CollaboratorAcceptedInvite.php create mode 100644 app/App/Collaborator/Notifications/CollaboratorDeclinedInvite.php create mode 100644 app/App/Console/Commands/CheckRemoteServerExistence.php create mode 100644 app/App/Console/Commands/IndexServerProviderImages.php create mode 100644 app/App/Console/Commands/IndexServerProviderPlans.php create mode 100644 app/App/Console/Commands/IndexServerProviderRegions.php create mode 100644 app/App/Console/Commands/Jobs/MaintainServerProviderKey.php create mode 100644 app/App/Console/Commands/Jobs/PingServer.php create mode 100644 app/App/Console/Commands/Jobs/RemoteServerExistence.php create mode 100644 app/App/Console/Commands/Jobs/SyncServerRemoteAddress.php create mode 100644 app/App/Console/Commands/MaintainInvitations.php create mode 100644 app/App/Console/Commands/MaintainServerProviderKeys.php create mode 100644 app/App/Console/Commands/PingRemoteServers.php create mode 100644 app/App/Console/Commands/PurgeServersWithFailedDeployments.php create mode 100644 app/App/Console/Commands/RunPlaybookCommand.php create mode 100644 app/App/Console/Commands/SyncServerRemoteAddresses.php create mode 100644 app/App/Console/Kernel.php create mode 100644 app/App/Console/Playbooks/BarePlaybook.php create mode 100644 app/App/Console/Playbooks/CoinPlaybook.php create mode 100644 app/App/Console/Playbooks/DatabaseNotificationPlaybook.php create mode 100644 app/App/Console/Playbooks/DemoPlaybook.php create mode 100644 app/App/Console/Playbooks/DevelopmentPlaybook.php create mode 100644 app/App/Console/Playbooks/InvitationPlaybook.php create mode 100644 app/App/Console/Playbooks/NetworkPlaybook.php create mode 100644 app/App/Console/Playbooks/NotificationPlaybook.php create mode 100644 app/App/Console/Playbooks/Playbook.php create mode 100644 app/App/Console/Playbooks/PlaybookDefinition.php create mode 100644 app/App/Console/Playbooks/SecureShellKeyPlaybook.php create mode 100644 app/App/Console/Playbooks/ServerPlaybook.php create mode 100644 app/App/Console/Playbooks/ServerProviderPlaybook.php create mode 100644 app/App/Console/Playbooks/TokenPlaybook.php create mode 100644 app/App/Console/Playbooks/UserPlaybook.php create mode 100644 app/App/Contracts/LogsActivity.php create mode 100644 app/App/Enums/ActivityDescriptionEnum.php create mode 100644 app/App/Enums/Constants.php create mode 100644 app/App/Enums/NetworkTypeEnum.php create mode 100644 app/App/Enums/ServerProviderTypeEnum.php create mode 100644 app/App/Exceptions/Handler.php create mode 100644 app/App/Http/Components/DownloadInstallScript.php create mode 100644 app/App/Http/Components/ManageWelcomeScreens.php create mode 100644 app/App/Http/Components/Modals/BetaNotice.php create mode 100644 app/App/Http/Components/UseDefaultsModal.php create mode 100644 app/App/Http/Kernel.php create mode 100644 app/App/Listeners/FlushMediaCache.php create mode 100644 app/App/Listeners/ListenForActivityLogs.php create mode 100644 app/App/Providers/AppServiceProvider.php create mode 100644 app/App/Providers/AuthServiceProvider.php create mode 100644 app/App/Providers/BroadcastServiceProvider.php create mode 100644 app/App/Providers/DuskServiceProvider.php create mode 100644 app/App/Providers/EventServiceProvider.php create mode 100644 app/App/Providers/HorizonServiceProvider.php create mode 100644 app/App/Providers/LivewireServiceProvider.php create mode 100644 app/App/Providers/RouteServiceProvider.php create mode 100644 app/App/Providers/ViewServiceProvider.php create mode 100644 app/App/SecureShell/Components/CreateSecureShellKey.php create mode 100644 app/App/SecureShell/Components/DeleteSecureShellKey.php create mode 100644 app/App/SecureShell/Jobs/AddSecureShellKeyToServerProvider.php create mode 100644 app/App/SecureShell/Jobs/RemoveSecureShellKeyFromServerProvider.php create mode 100644 app/App/Server/Components/CreateServer.php create mode 100644 app/App/Server/Components/DeleteServer.php create mode 100644 app/App/Server/Components/DeleteServerProvider.php create mode 100644 app/App/Server/Components/ManageServerConfiguration.php create mode 100644 app/App/Server/Components/ManageServerProviders.php create mode 100644 app/App/Server/Components/RedirectOnServerProviderCompletion.php create mode 100644 app/App/Server/Components/RenameServer.php create mode 100644 app/App/Server/Components/ServerDeploymentTracker.php create mode 100644 app/App/Server/Controllers/DeploymentStatusController.php create mode 100644 app/App/Server/Jobs/CreateServerOnProvider.php create mode 100644 app/App/Server/Jobs/DestroyServerOnServerProvider.php create mode 100644 app/App/Server/Jobs/IndexServerProviderImages.php create mode 100644 app/App/Server/Jobs/IndexServerProviderPlans.php create mode 100644 app/App/Server/Jobs/IndexServerProviderRegions.php create mode 100644 app/App/Server/Jobs/ProvisionServer.php create mode 100644 app/App/Server/Jobs/ProvisionUser.php create mode 100644 app/App/Server/Jobs/RemovePasswordsFromServer.php create mode 100644 app/App/Server/Jobs/ServerProvisioner.php create mode 100644 app/App/Server/Jobs/WaitForServerToStart.php create mode 100644 app/App/Server/Notifications/IndexServerProviderImagesFailed.php create mode 100644 app/App/Server/Notifications/IndexServerProviderPlansFailed.php create mode 100644 app/App/Server/Notifications/IndexServerProviderRegionsFailed.php create mode 100644 app/App/Server/Notifications/RemoteServerLimitReached.php create mode 100644 app/App/Server/Notifications/ServerDeleted.php create mode 100644 app/App/Server/Notifications/ServerDeployed.php create mode 100644 app/App/Server/Notifications/ServerFailedDeployment.php create mode 100644 app/App/Server/Notifications/ServerFailedToCreateOnProvider.php create mode 100644 app/App/Server/Notifications/ServerProviderAuthenticationFailed.php create mode 100644 app/App/Server/Notifications/ServerProviderSecureShellKeyAdditionFailed.php create mode 100644 app/App/Server/Notifications/ServerProviderSecureShellKeyLimitReached.php create mode 100644 app/App/Server/Notifications/ServerProviderSecureShellKeyRemovalFailed.php create mode 100644 app/App/Server/Notifications/ServerProviderSecureShellKeyUniqueness.php create mode 100644 app/App/Server/Notifications/ServerProviderServerRemovalFailed.php create mode 100644 app/App/Server/Notifications/ServerProvisioned.php create mode 100644 app/App/Server/Notifications/ServerUnreachable.php create mode 100644 app/App/Server/Requests/StoreServerProviderRequest.php create mode 100644 app/App/Server/Resources/PlanResource.php create mode 100644 app/App/Server/Resources/RegionResource.php create mode 100644 app/App/Token/Components/ActiveServers.php create mode 100644 app/App/Token/Components/CreateTokenModal.php create mode 100644 app/App/Token/Components/DeleteToken.php create mode 100644 app/App/Token/Components/DeployBlockchain.php create mode 100644 app/App/Token/Components/LogoUpload.php create mode 100644 app/App/Token/Components/ManageTokenSecureShellKeys.php create mode 100644 app/App/Token/Components/ManageTokens.php create mode 100644 app/App/Token/Components/UpdateToken.php create mode 100644 app/App/Token/Controllers/DeploymentConfigController.php create mode 100644 app/App/Token/Controllers/InstallationScriptController.php create mode 100644 app/App/Token/Controllers/TokenActivityController.php create mode 100644 app/App/Token/Controllers/TokenCollaboratorController.php create mode 100644 app/App/Token/Controllers/TokenController.php create mode 100644 app/App/Token/Controllers/TokenDetailsController.php create mode 100644 app/App/Token/Controllers/TokenInvitationController.php create mode 100644 app/App/Token/Controllers/TokenOnboardingController.php create mode 100644 app/App/Token/Controllers/TokenSecureShellKeyController.php create mode 100644 app/App/Token/Controllers/TokenServerActionController.php create mode 100644 app/App/Token/Controllers/TokenServerConfigurationController.php create mode 100644 app/App/Token/Controllers/TokenServerController.php create mode 100644 app/App/Token/Controllers/TokenServerProviderController.php create mode 100644 app/App/Token/Notifications/TokenDeleted.php create mode 100644 app/App/Token/Requests/DeploymentConfigRequest.php create mode 100644 app/App/User/Components/ManageSecureShellKeys.php create mode 100644 app/App/User/Components/UpdateUserAccount.php create mode 100644 app/App/User/Mail/ConfirmEmailChange.php create mode 100644 app/App/User/Mail/PersonalDataExport.php create mode 100644 app/App/View/Components/BlockchainLogo.php create mode 100644 app/App/View/Components/SortByButton.php create mode 100644 app/Domain/Coin/Models/Coin.php create mode 100644 app/Domain/Collaborator/Actions/InviteCollaboratorAction.php create mode 100644 app/Domain/Collaborator/Models/Collaborator.php create mode 100644 app/Domain/Collaborator/Models/Invitation.php create mode 100644 app/Domain/SecureShell/Contracts/Script.php create mode 100644 app/Domain/SecureShell/Contracts/SecureShellKeyGenerator.php create mode 100644 app/Domain/SecureShell/Contracts/ShellProcessRunner.php create mode 100644 app/Domain/SecureShell/Exceptions/SecureShellKeyAlreadyInUse.php create mode 100644 app/Domain/SecureShell/Facades/SecureShellKey.php create mode 100644 app/Domain/SecureShell/Facades/ShellProcessRunner.php create mode 100644 app/Domain/SecureShell/Models/SecureShellKey.php create mode 100644 app/Domain/SecureShell/Policies/SecureShellKeyPolicy.php create mode 100644 app/Domain/SecureShell/Rules/SecureShellKey.php create mode 100644 app/Domain/SecureShell/Scripts/Concerns/LocatesScript.php create mode 100644 app/Domain/SecureShell/Scripts/Concerns/ManagesScriptVariables.php create mode 100644 app/Domain/SecureShell/Scripts/ManualScript.php create mode 100644 app/Domain/SecureShell/Scripts/ProvisionExplorer.php create mode 100644 app/Domain/SecureShell/Scripts/ProvisionForger.php create mode 100644 app/Domain/SecureShell/Scripts/ProvisionGenesis.php create mode 100644 app/Domain/SecureShell/Scripts/ProvisionRelay.php create mode 100644 app/Domain/SecureShell/Scripts/ProvisionSeed.php create mode 100644 app/Domain/SecureShell/Scripts/ProvisionUser.php create mode 100644 app/Domain/SecureShell/Services/SecureShell.php create mode 100644 app/Domain/SecureShell/Services/SecureShellCommand.php create mode 100644 app/Domain/SecureShell/Services/SecureShellKey.php create mode 100644 app/Domain/SecureShell/Services/ShellProcessRunner.php create mode 100644 app/Domain/SecureShell/Services/ShellResponse.php create mode 100644 app/Domain/Server/Contracts/ServerProviderClient.php create mode 100644 app/Domain/Server/Contracts/ServerProviderExceptionHandler.php create mode 100644 app/Domain/Server/DTO/Casters/ImageCollectionCaster.php create mode 100644 app/Domain/Server/DTO/Casters/PlanCollectionCaster.php create mode 100644 app/Domain/Server/DTO/Casters/RegionCollectionCaster.php create mode 100644 app/Domain/Server/DTO/Image.php create mode 100644 app/Domain/Server/DTO/ImageCollection.php create mode 100644 app/Domain/Server/DTO/Plan.php create mode 100644 app/Domain/Server/DTO/PlanCollection.php create mode 100644 app/Domain/Server/DTO/Region.php create mode 100644 app/Domain/Server/DTO/RegionCollection.php create mode 100644 app/Domain/Server/DTO/SecureShellKey.php create mode 100644 app/Domain/Server/DTO/Server.php create mode 100644 app/Domain/Server/Enums/PresetTypeEnum.php create mode 100644 app/Domain/Server/Enums/ServerAttributeEnum.php create mode 100644 app/Domain/Server/Enums/ServerDeploymentStatus.php create mode 100644 app/Domain/Server/Enums/ServerTaskStatusEnum.php create mode 100644 app/Domain/Server/Exceptions/ServerCoreLimitExceeded.php create mode 100644 app/Domain/Server/Exceptions/ServerLimitExceeded.php create mode 100644 app/Domain/Server/Exceptions/ServerNotFound.php create mode 100644 app/Domain/Server/Exceptions/ServerProviderAuthenticationException.php create mode 100644 app/Domain/Server/Exceptions/ServerProviderError.php create mode 100644 app/Domain/Server/Exceptions/ServerProviderSecureShellKeyLimitReached.php create mode 100644 app/Domain/Server/Exceptions/ServerProviderSecureShellKeyUniqueness.php create mode 100644 app/Domain/Server/Models/Server.php create mode 100644 app/Domain/Server/Models/ServerProvider.php create mode 100644 app/Domain/Server/Models/ServerProviderImage.php create mode 100644 app/Domain/Server/Models/ServerProviderPlan.php create mode 100644 app/Domain/Server/Models/ServerProviderRegion.php create mode 100644 app/Domain/Server/Models/ServerTask.php create mode 100644 app/Domain/Server/Policies/ServerPolicy.php create mode 100644 app/Domain/Server/Policies/ServerProviderPolicy.php create mode 100644 app/Domain/Server/Services/Providers/AWS.php create mode 100644 app/Domain/Server/Services/Providers/AWSExceptionHandler.php create mode 100644 app/Domain/Server/Services/Providers/DigitalOcean.php create mode 100644 app/Domain/Server/Services/Providers/DigitalOceanExceptionHandler.php create mode 100644 app/Domain/Server/Services/Providers/Hetzner.php create mode 100644 app/Domain/Server/Services/Providers/HetznerExceptionHandler.php create mode 100644 app/Domain/Server/Services/Providers/Linode.php create mode 100644 app/Domain/Server/Services/Providers/LinodeExceptionHandler.php create mode 100644 app/Domain/Server/Services/Providers/Vultr.php create mode 100644 app/Domain/Server/Services/Providers/VultrExceptionHandler.php create mode 100644 app/Domain/Server/Services/ServerProviderClientFactory.php create mode 100644 app/Domain/Server/Support/Rules/ValidAWSServerName.php create mode 100644 app/Domain/Server/Support/Rules/ValidDigitalOceanServerName.php create mode 100644 app/Domain/Server/Support/Rules/ValidHetznerServerName.php create mode 100644 app/Domain/Server/Support/Rules/ValidLinodeServerName.php create mode 100644 app/Domain/Server/Support/Rules/ValidVultrServerName.php create mode 100644 app/Domain/Status/Models/Activity.php create mode 100644 app/Domain/Status/Models/Status.php create mode 100644 app/Domain/Token/Enums/TokenAttributeEnum.php create mode 100644 app/Domain/Token/Enums/TokenOnboardingStatusEnum.php create mode 100644 app/Domain/Token/Enums/TokenStatusEnum.php create mode 100644 app/Domain/Token/Events/NetworkCreated.php create mode 100644 app/Domain/Token/Events/ServerCreated.php create mode 100644 app/Domain/Token/Events/ServerDeleted.php create mode 100644 app/Domain/Token/Events/ServerProviderCreated.php create mode 100644 app/Domain/Token/Events/ServerProviderDeleted.php create mode 100644 app/Domain/Token/Events/ServerProviderUpdated.php create mode 100644 app/Domain/Token/Events/ServerUpdating.php create mode 100644 app/Domain/Token/Events/TokenCreated.php create mode 100644 app/Domain/Token/Events/TokenDeleted.php create mode 100644 app/Domain/Token/Listeners/ServerCreated/CreateServerOnProvider.php create mode 100644 app/Domain/Token/Listeners/ServerDeleted/DestroyServerOnServerProvider.php create mode 100644 app/Domain/Token/Listeners/ServerDeleted/NotifyUsersOfServerDeletion.php create mode 100644 app/Domain/Token/Listeners/ServerProviderDeleted/ForgetServerProviderTokenConfiguration.php create mode 100644 app/Domain/Token/Listeners/ServerProviderDeleted/TriggerSecureShellKeyRemovalFromServerProvider.php create mode 100644 app/Domain/Token/Listeners/ServerProviderUpdated/IndexServerProviderRelatedData.php create mode 100644 app/Domain/Token/Listeners/ServerUpdating/UpdateServerProviderName.php create mode 100644 app/Domain/Token/Listeners/TokenCreated/CreateDefaultNetworks.php create mode 100644 app/Domain/Token/Listeners/TokenDeleted/NotifyCollaborators.php create mode 100644 app/Domain/Token/Listeners/TokenDeleted/PurgeTokenResources.php create mode 100644 app/Domain/Token/Listeners/TokenDeleted/RemoveTokenNotifications.php create mode 100644 app/Domain/Token/Models/Network.php create mode 100644 app/Domain/Token/Models/Token.php create mode 100644 app/Domain/Token/Policies/TokenPolicy.php create mode 100644 app/Domain/Token/Rules/ReservedTokenName.php create mode 100644 app/Domain/Token/Rules/UniqueTokenExtraAttribute.php create mode 100644 app/Domain/User/Models/DatabaseNotification.php create mode 100644 app/Domain/User/Models/User.php create mode 100644 app/Domain/User/Observers/UserObserver.php create mode 100644 app/Support/AddressPrefixes.php create mode 100644 app/Support/Builders/NotificationBuilder.php create mode 100644 app/Support/Components/Concerns/HasDefaultRender.php create mode 100644 app/Support/Components/Concerns/HasFlashMessages.php create mode 100644 app/Support/Components/Concerns/InteractsWithPermissions.php create mode 100644 app/Support/Components/Concerns/InteractsWithToken.php create mode 100644 app/Support/Components/Concerns/InteractsWithUser.php create mode 100644 app/Support/Components/Concerns/ManagesToken.php create mode 100644 app/Support/Components/Concerns/Sortable.php create mode 100644 app/Support/Components/YoutubeModal.php create mode 100644 app/Support/Eloquent/Concerns/HasSchemalessAttributes.php create mode 100644 app/Support/Eloquent/Model.php create mode 100644 app/Support/Helpers/Format.php create mode 100644 app/Support/Http/Controllers/Controller.php create mode 100644 app/Support/Http/Middleware/Authenticate.php create mode 100644 app/Support/Http/Middleware/EncryptCookies.php create mode 100644 app/Support/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 app/Support/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 app/Support/Http/Middleware/RedirectIfOnboarding.php create mode 100644 app/Support/Http/Middleware/ThrottleWithSessionToken.php create mode 100644 app/Support/Http/Middleware/TrimStrings.php create mode 100644 app/Support/Http/Middleware/TrustProxies.php create mode 100644 app/Support/Http/Middleware/VerifyCsrfToken.php create mode 100644 app/Support/Rules/AddressPrefix.php create mode 100644 app/Support/Rules/BIP39Passphrase.php create mode 100644 app/Support/Rules/Port.php create mode 100644 app/Support/Services/ActivityLogger.php create mode 100644 app/Support/Services/Haiku.php create mode 100644 app/Support/Services/Json.php create mode 100644 app/Support/Services/OnboardingManager.php create mode 100644 app/Support/Services/PasswordGenerator.php create mode 100755 artisan create mode 100644 banner.png create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/activitylog.php create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/aws.php create mode 100644 config/backup.php create mode 100644 config/blade-icons.php create mode 100644 config/broadcasting.php create mode 100644 config/cache.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/debugbar.php create mode 100644 config/deployer.php create mode 100644 config/filesystems.php create mode 100644 config/fortify.php create mode 100644 config/github.php create mode 100644 config/google2fa.php create mode 100644 config/hashing.php create mode 100644 config/hermes.php create mode 100644 config/horizon.php create mode 100644 config/livewire.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/model-status.php create mode 100644 config/personal-data-export.php create mode 100644 config/queue.php create mode 100644 config/responsecache.php create mode 100644 config/sentry.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 config/social.php create mode 100644 config/telescope.php create mode 100644 config/tracking.php create mode 100644 config/trustedproxy.php create mode 100644 config/view.php create mode 100644 config/web.php create mode 100644 database/.gitignore create mode 100644 database/factories/CoinFactory.php create mode 100644 database/factories/DatabaseNotificationFactory.php create mode 100644 database/factories/InvitationFactory.php create mode 100644 database/factories/NetworkFactory.php create mode 100644 database/factories/SecureShellKeyFactory.php create mode 100644 database/factories/ServerFactory.php create mode 100644 database/factories/ServerProviderFactory.php create mode 100644 database/factories/ServerProviderImageFactory.php create mode 100644 database/factories/ServerProviderPlanFactory.php create mode 100644 database/factories/ServerProviderRegionFactory.php create mode 100644 database/factories/ServerTaskFactory.php create mode 100644 database/factories/TokenFactory.php create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/2014_10_12_000000_create_users_table.php create mode 100644 database/migrations/2014_10_12_100000_create_password_resets_table.php create mode 100644 database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php create mode 100644 database/migrations/2020_01_14_000000_create_failed_jobs_table.php create mode 100644 database/migrations/2020_01_15_000000_create_activity_log_table.php create mode 100644 database/migrations/2020_01_15_100000_create_statuses_table.php create mode 100644 database/migrations/2020_01_15_101832_create_coin_table.php create mode 100644 database/migrations/2020_01_16_000000_create_tokens_table.php create mode 100644 database/migrations/2020_01_16_100000_create_server_providers_table.php create mode 100644 database/migrations/2020_01_16_300000_create_networks_table.php create mode 100644 database/migrations/2020_01_16_400000_create_servers_table.php create mode 100644 database/migrations/2020_01_16_500000_create_secure_shell_keys_table.php create mode 100644 database/migrations/2020_01_17_100000_create_invitations_table.php create mode 100644 database/migrations/2020_01_22_052713_create_media_table.php create mode 100644 database/migrations/2020_02_05_030355_create_server_tasks_table.php create mode 100644 database/migrations/2020_05_20_114046_create_token_secure_shell_keys.php create mode 100644 database/migrations/2020_09_16_135202_add_uuid_to_failed_jobs_table.php create mode 100644 database/migrations/2020_10_21_171258_add_last_login_at_to_users_table.php create mode 100644 database/migrations/2020_11_17_000000_create_notifications_table.php create mode 100644 database/migrations/2022_01_26_092328_add_event_column_to_activity_log_table.php create mode 100644 database/migrations/2022_01_26_092329_add_batch_uuid_column_to_activity_log_table.php create mode 100644 database/migrations/2022_06_06_211404_add_deleted_at_column_to_server_providers_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 docker-compose.yml create mode 100644 package.json create mode 100644 phpunit.sail.xml create mode 100644 phpunit.xml create mode 100644 psalm.xml create mode 100644 public/.htaccess create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/browserconfig.xml create mode 100644 public/css/app.css create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/fonts/FiraMono-Bold.otf create mode 100644 public/fonts/FiraMono-Regular.otf create mode 100644 public/fonts/FiraMono-RegularItalic.otf create mode 100644 public/images/ark-logo.svg create mode 100644 public/images/auth/verify-email.svg create mode 100644 public/images/bridgechain.svg create mode 100644 public/images/defaults/my-team.svg create mode 100644 public/images/defaults/no-notifications-navbar.svg create mode 100644 public/images/defaults/no-notifications-page.svg create mode 100644 public/images/defaults/no-notifications.svg create mode 100644 public/images/defaults/pending-invitation.svg create mode 100644 public/images/defaults/user.svg create mode 100644 public/images/home/basic.svg create mode 100644 public/images/home/customize.png create mode 100644 public/images/home/deploy.png create mode 100644 public/images/home/enterprise.svg create mode 100644 public/images/home/header.png create mode 100644 public/images/home/manage.png create mode 100644 public/images/home/premium.svg create mode 100644 public/images/installation_complete.svg create mode 100644 public/images/installation_failed.svg create mode 100644 public/images/logo.svg create mode 100644 public/images/mail/confirm.png create mode 100644 public/images/mail/github.png create mode 100644 public/images/mail/invitation.png create mode 100644 public/images/mail/logo.png create mode 100644 public/images/mail/personal-data.png create mode 100644 public/images/mail/reset-password.png create mode 100644 public/images/mail/server.png create mode 100644 public/images/mail/twitter.png create mode 100644 public/images/mail/verify.png create mode 100644 public/images/metadata.png create mode 100644 public/images/modal/delete.svg create mode 100644 public/images/modal/email-change-confirm.svg create mode 100644 public/images/modal/email-change.svg create mode 100644 public/images/modal/expired-link.svg create mode 100644 public/images/modal/information.svg create mode 100644 public/images/modal/invalid-link.svg create mode 100644 public/images/modal/success.svg create mode 100644 public/images/modal/warning.svg create mode 100644 public/images/onboarding-footer.svg create mode 100644 public/images/onboarding.svg create mode 100644 public/images/server-providers/aws.svg create mode 100644 public/images/server-providers/digitalocean.svg create mode 100644 public/images/server-providers/hetnzer.svg create mode 100644 public/images/server-providers/hetzner.svg create mode 100644 public/images/server-providers/linode.svg create mode 100644 public/images/server-providers/vultr.svg create mode 100644 public/images/server/block-explorer.svg create mode 100644 public/images/server/github.svg create mode 100644 public/images/status.svg create mode 100644 public/images/support.svg create mode 100644 public/images/tokens.svg create mode 100644 public/images/vendor/ark/article/placeholder-banner.png create mode 100644 public/images/vendor/ark/search/empty-dark.svg create mode 100644 public/images/vendor/ark/search/empty.svg create mode 100644 public/images/verified-email.svg create mode 100644 public/images/verify-email.svg create mode 100644 public/images/welcome/intro.svg create mode 100644 public/images/welcome/slide0.svg create mode 100644 public/images/welcome/slide1.svg create mode 100644 public/images/welcome/slide2.svg create mode 100644 public/images/welcome/slide3.svg create mode 100644 public/images/wizard/bitbucket.svg create mode 100644 public/images/wizard/github.svg create mode 100644 public/images/wizard/gitlab.svg create mode 100644 public/index.php create mode 100644 public/js/app.js create mode 100644 public/js/app.js.LICENSE create mode 100644 public/js/app.js.LICENSE.txt create mode 100644 public/js/clipboard.js create mode 100644 public/js/cookie-consent.js create mode 100644 public/js/cookie-consent.js.LICENSE.txt create mode 100644 public/js/crop-image.js create mode 100644 public/js/crop-image.js.LICENSE.txt create mode 100644 public/js/file-download.js create mode 100644 public/js/file-upload.js create mode 100644 public/js/manifest.js create mode 100644 public/js/swiper.js create mode 100644 public/js/swiper.min.js create mode 100644 public/js/vendor.js create mode 100644 public/js/vendor.js.LICENSE create mode 100644 public/main.js create mode 100644 public/manifest.js create mode 100644 public/mix-manifest.json create mode 100644 public/mstile-144x144.png create mode 100644 public/mstile-150x150.png create mode 100644 public/mstile-310x150.png create mode 100644 public/mstile-310x310.png create mode 100644 public/mstile-70x70.png create mode 100644 public/robots.txt create mode 100644 public/safari-pinned-tab.svg create mode 100644 public/site.webmanifest create mode 100644 public/vendor.js create mode 100644 public/vendor/horizon/app-dark.css create mode 100644 public/vendor/horizon/app.css create mode 100644 public/vendor/horizon/app.js create mode 100644 public/vendor/horizon/img/favicon.png create mode 100644 public/vendor/horizon/img/horizon.svg create mode 100644 public/vendor/horizon/img/sprite.svg create mode 100644 public/vendor/horizon/mix-manifest.json create mode 100644 public/vendor/nova/app.css create mode 100644 public/vendor/nova/app.js create mode 100644 public/vendor/nova/manifest.js create mode 100644 public/vendor/nova/mix-manifest.json create mode 100644 public/vendor/nova/vendor.js create mode 100644 public/vendor/telescope/app-dark.css create mode 100644 public/vendor/telescope/app.css create mode 100644 public/vendor/telescope/app.js create mode 100644 public/vendor/telescope/favicon.ico create mode 100644 public/vendor/telescope/mix-manifest.json create mode 100644 public/web.config create mode 100644 readme.md create mode 100644 rector.php create mode 100644 resources/css/_general.css create mode 100644 resources/css/_pagination.css create mode 100644 resources/css/_theme.css create mode 100644 resources/css/app.css create mode 100644 resources/fonts/FiraMono-Bold.otf create mode 100644 resources/fonts/FiraMono-Regular.otf create mode 100644 resources/fonts/FiraMono-RegularItalic.otf create mode 100644 resources/icons/.gitkeep create mode 100644 resources/icons/errors/401.svg create mode 100644 resources/icons/errors/403.svg create mode 100644 resources/icons/errors/404.svg create mode 100644 resources/icons/errors/419.svg create mode 100644 resources/icons/errors/429.svg create mode 100644 resources/icons/errors/500.svg create mode 100644 resources/icons/errors/503.svg create mode 100644 resources/icons/errors/generic.svg create mode 100644 resources/images/ark-logo.svg create mode 100644 resources/images/defaults/my-team.svg create mode 100644 resources/images/defaults/no-notifications-navbar.svg create mode 100644 resources/images/defaults/no-notifications-page.svg create mode 100644 resources/images/defaults/user.svg create mode 100644 resources/images/home/basic.svg create mode 100644 resources/images/home/customize.png create mode 100644 resources/images/home/deploy.png create mode 100644 resources/images/home/enterprise.svg create mode 100644 resources/images/home/header.png create mode 100644 resources/images/home/manage.png create mode 100644 resources/images/home/premium.svg create mode 100644 resources/images/installation_complete.svg create mode 100644 resources/images/installation_failed.svg create mode 100644 resources/images/logo.svg create mode 100644 resources/images/mail/confirm.png create mode 100644 resources/images/mail/github.png create mode 100644 resources/images/mail/invitation.png create mode 100644 resources/images/mail/logo.png create mode 100644 resources/images/mail/personal-data.png create mode 100644 resources/images/mail/reset-password.png create mode 100644 resources/images/mail/server.png create mode 100644 resources/images/mail/twitter.png create mode 100644 resources/images/mail/verify.png create mode 100644 resources/images/metadata.png create mode 100644 resources/images/modal/delete.svg create mode 100644 resources/images/modal/email-change-confirm.svg create mode 100644 resources/images/modal/email-change.svg create mode 100644 resources/images/modal/expired-link.svg create mode 100644 resources/images/modal/information.svg create mode 100644 resources/images/modal/invalid-link.svg create mode 100644 resources/images/modal/success.svg create mode 100644 resources/images/modal/warning.svg create mode 100644 resources/images/onboarding-footer.svg create mode 100644 resources/images/onboarding.svg create mode 100644 resources/images/server-providers/aws.svg create mode 100644 resources/images/server-providers/digitalocean.svg create mode 100644 resources/images/server-providers/hetzner.svg create mode 100644 resources/images/server-providers/linode.svg create mode 100644 resources/images/server-providers/vultr.svg create mode 100644 resources/images/server/block-explorer.svg create mode 100644 resources/images/server/github.svg create mode 100644 resources/images/status.svg create mode 100644 resources/images/support.svg create mode 100644 resources/images/tokens.svg create mode 100644 resources/images/vendor/ark/article/placeholder-banner.png create mode 100644 resources/images/vendor/ark/search/empty-dark.svg create mode 100644 resources/images/vendor/ark/search/empty.svg create mode 100644 resources/images/verified-email.svg create mode 100644 resources/images/verify-email.svg create mode 100644 resources/images/welcome/intro.svg create mode 100644 resources/images/welcome/slide0.svg create mode 100644 resources/images/welcome/slide1.svg create mode 100644 resources/images/welcome/slide2.svg create mode 100644 resources/images/welcome/slide3.svg create mode 100644 resources/images/wizard/bitbucket.svg create mode 100644 resources/images/wizard/github.svg create mode 100644 resources/images/wizard/gitlab.svg create mode 100644 resources/js/app.js create mode 100644 resources/js/file-download.js create mode 100644 resources/js/file-upload.js create mode 100644 resources/js/vendor/ark/reposition-dropdown.js create mode 100644 resources/lang/en/actions.php create mode 100644 resources/lang/en/activity.php create mode 100644 resources/lang/en/auth.php create mode 100644 resources/lang/en/exceptions.php create mode 100644 resources/lang/en/forms.php create mode 100644 resources/lang/en/general.php create mode 100644 resources/lang/en/invitations.php create mode 100644 resources/lang/en/mails.php create mode 100644 resources/lang/en/menus.php create mode 100644 resources/lang/en/metatags.php create mode 100644 resources/lang/en/modals.php create mode 100644 resources/lang/en/notifications.php create mode 100644 resources/lang/en/pages.php create mode 100644 resources/lang/en/pagination.php create mode 100644 resources/lang/en/passwords.php create mode 100644 resources/lang/en/repository.php create mode 100644 resources/lang/en/scripts.php create mode 100644 resources/lang/en/shared.php create mode 100644 resources/lang/en/tables.php create mode 100644 resources/lang/en/tokens.php create mode 100644 resources/lang/en/tokens_blacklist.php create mode 100644 resources/lang/en/tooltips.php create mode 100644 resources/lang/en/urls.php create mode 100644 resources/lang/en/validation.php create mode 100644 resources/lang/vendor/nova/en.json create mode 100644 resources/lang/vendor/nova/en/validation.php create mode 100644 resources/views/app/cookie-policy.blade.php create mode 100644 resources/views/app/privacy-policy.blade.php create mode 100644 resources/views/app/terms-of-service.blade.php create mode 100644 resources/views/app/tokens/activity.blade.php create mode 100644 resources/views/app/tokens/collaborators.blade.php create mode 100644 resources/views/app/tokens/configure/buttons.blade.php create mode 100644 resources/views/app/tokens/configure/fees.blade.php create mode 100644 resources/views/app/tokens/configure/general.blade.php create mode 100644 resources/views/app/tokens/configure/network.blade.php create mode 100644 resources/views/app/tokens/configure/review.blade.php create mode 100644 resources/views/app/tokens/details.blade.php create mode 100644 resources/views/app/tokens/edit.blade.php create mode 100644 resources/views/app/tokens/index.blade.php create mode 100644 resources/views/app/tokens/onboard.blade.php create mode 100644 resources/views/app/tokens/secure-shell-keys.blade.php create mode 100644 resources/views/app/tokens/server-configuration.blade.php create mode 100644 resources/views/app/tokens/server-providers.blade.php create mode 100644 resources/views/app/tokens/servers/create.blade.php create mode 100644 resources/views/app/tokens/servers/index.blade.php create mode 100644 resources/views/app/tokens/servers/show.blade.php create mode 100644 resources/views/app/under-construction.blade.php create mode 100644 resources/views/app/user/settings/notifications.blade.php create mode 100644 resources/views/app/user/settings/profile.blade.php create mode 100644 resources/views/app/user/settings/security.blade.php create mode 100644 resources/views/app/user/settings/ssh-keys.blade.php create mode 100644 resources/views/app/user/settings/teams.blade.php create mode 100644 resources/views/components/blank.blade.php create mode 100644 resources/views/components/blockchain-logo.blade.php create mode 100644 resources/views/components/delete-modal.blade.php create mode 100644 resources/views/components/divider.blade.php create mode 100644 resources/views/components/grid.blade.php create mode 100644 resources/views/components/griddy.blade.php create mode 100644 resources/views/components/home/active-servers/action-dropdown.blade.php create mode 100644 resources/views/components/home/active-servers/desktop-table.blade.php create mode 100644 resources/views/components/home/active-servers/desktop-tabs.blade.php create mode 100644 resources/views/components/home/active-servers/mobile-accordion.blade.php create mode 100644 resources/views/components/home/active-servers/mobile-dropdown.blade.php create mode 100644 resources/views/components/home/active-servers/type-filter.blade.php create mode 100644 resources/views/components/modals/expired-link-modal.blade.php create mode 100644 resources/views/components/modals/invalid-link-modal.blade.php create mode 100644 resources/views/components/onboard-step.blade.php create mode 100644 resources/views/components/pending-invitations.blade.php create mode 100644 resources/views/components/profile/keys/desktop.blade.php create mode 100644 resources/views/components/profile/keys/item.blade.php create mode 100644 resources/views/components/profile/keys/mobile.blade.php create mode 100644 resources/views/components/server-providers/desktop.blade.php create mode 100644 resources/views/components/server-providers/item.blade.php create mode 100644 resources/views/components/server-providers/mobile.blade.php create mode 100644 resources/views/components/server-providers/select.blade.php create mode 100644 resources/views/components/servers/status.blade.php create mode 100644 resources/views/components/sort-by-button.blade.php create mode 100644 resources/views/components/token-sidebar-links.blade.php create mode 100644 resources/views/components/token-slider-placeholder.blade.php create mode 100644 resources/views/components/token-slider.blade.php create mode 100644 resources/views/components/tokens/details-item.blade.php create mode 100644 resources/views/components/tokens/heading.blade.php create mode 100644 resources/views/components/tokens/onboard-buttons.blade.php create mode 100644 resources/views/components/tokens/sidebar-divider.blade.php create mode 100644 resources/views/components/tokens/step-indicator.blade.php create mode 100644 resources/views/components/tokens/subheading.blade.php create mode 100644 resources/views/components/truncated-cell.blade.php create mode 100644 resources/views/components/user-teams.blade.php create mode 100644 resources/views/components/welcome-screens.blade.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/layouts/server.blade.php create mode 100644 resources/views/layouts/token.blade.php create mode 100644 resources/views/layouts/user-settings.blade.php create mode 100644 resources/views/livewire/active-servers.blade.php create mode 100644 resources/views/livewire/collaborator-permissions-modal.blade.php create mode 100644 resources/views/livewire/create-secure-shell-key.blade.php create mode 100644 resources/views/livewire/create-server.blade.php create mode 100644 resources/views/livewire/create-token-modal.blade.php create mode 100644 resources/views/livewire/decline-invitation-modal.blade.php create mode 100644 resources/views/livewire/delete-collaborator.blade.php create mode 100644 resources/views/livewire/delete-secure-shell-key.blade.php create mode 100644 resources/views/livewire/delete-server-provider.blade.php create mode 100644 resources/views/livewire/delete-server.blade.php create mode 100644 resources/views/livewire/delete-token.blade.php create mode 100644 resources/views/livewire/deploy-blockchain.blade.php create mode 100644 resources/views/livewire/download-install-script.blade.php create mode 100644 resources/views/livewire/invite-collaborator.blade.php create mode 100644 resources/views/livewire/leave-team-modal.blade.php create mode 100644 resources/views/livewire/logo-upload.blade.php create mode 100644 resources/views/livewire/mailed-invitations.blade.php create mode 100644 resources/views/livewire/manage-collaborators.blade.php create mode 100644 resources/views/livewire/manage-secure-shell-keys.blade.php create mode 100644 resources/views/livewire/manage-server-configuration.blade.php create mode 100644 resources/views/livewire/manage-server-providers.blade.php create mode 100644 resources/views/livewire/manage-token-secure-shell-keys.blade.php create mode 100644 resources/views/livewire/manage-token.blade.php create mode 100644 resources/views/livewire/manage-tokens.blade.php create mode 100644 resources/views/livewire/manage-welcome-screens.blade.php create mode 100644 resources/views/livewire/modals/beta-notice.blade.php create mode 100644 resources/views/livewire/redirect-on-server-provider-completion.blade.php create mode 100644 resources/views/livewire/rename-server.blade.php create mode 100644 resources/views/livewire/server-deployment-tracker.blade.php create mode 100644 resources/views/livewire/update-collaborator.blade.php create mode 100644 resources/views/livewire/update-user-account.blade.php create mode 100644 resources/views/livewire/use-defaults-modal.blade.php create mode 100644 resources/views/livewire/youtube-modal.blade.php create mode 100644 resources/views/mails/confirm-email-change.blade.php create mode 100644 resources/views/mails/email-verification.blade.php create mode 100644 resources/views/mails/invite-existing-user.blade.php create mode 100644 resources/views/mails/invite-new-user.blade.php create mode 100644 resources/views/mails/personal-data-export.blade.php create mode 100644 resources/views/mails/reset-password.blade.php create mode 100644 resources/views/mails/server-failed-deployment.blade.php create mode 100644 resources/views/mails/server-provisioned.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/check-config.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/genesis/core/config.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/genesis/core/install-core.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/await-apt-unlock.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/configure-locale.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-jemalloc.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-node.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-ntp.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-pgsql.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-pm2.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-program.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-system.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/deps-yarn.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/detect-system.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/export-paths.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/guard-against-root.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/helpers.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/update-system.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/pre-install/visuals.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/shared/configure-database.blade.php create mode 100644 resources/views/scripts/ark/ark/manual/shared/create-alias.blade.php create mode 100644 resources/views/scripts/ark/ark/provision-explorer.blade.php create mode 100644 resources/views/scripts/ark/ark/provision-forger.blade.php create mode 100644 resources/views/scripts/ark/ark/provision-genesis.blade.php create mode 100644 resources/views/scripts/ark/ark/provision-manual.blade.php create mode 100644 resources/views/scripts/ark/ark/provision-relay.blade.php create mode 100644 resources/views/scripts/ark/ark/provision-seed.blade.php create mode 100644 resources/views/scripts/ark/ark/provision-user.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/arkscan/build.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/arkscan/clone.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/arkscan/config.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/arkscan/install.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/arkscan/start-processes.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/forger/configure.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/forger/start-processes.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/genesis/core/config.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/genesis/core/install-core.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/genesis/core/print-passphrases.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/genesis/core/store-config.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/genesis/start-processes.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/post-install.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/accept-github-remote.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/await-apt-unlock.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/configure-locale.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-docker.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-jemalloc.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-node.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-ntp.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-pgsql.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-pm2.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-program.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-system.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/deps-yarn.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/detect-system.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/export-paths.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/guard-against-root.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/helpers.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/secure-server.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/unattended-security-upgrades.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/update-system.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/pre-install/visuals.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/relay/start-processes.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/seed/start-processes.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/shared/configure-database.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/shared/create-alias.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/shared/create-boot-script.blade.php create mode 100644 resources/views/scripts/ark/ark/provision/shared/fetch-config.blade.php create mode 100644 resources/views/shared/flash.blade.php create mode 100644 resources/views/vendor/ark-fortify/auth/login.blade.php create mode 100644 resources/views/vendor/ark/pagination-url.blade.php create mode 100644 resources/views/vendor/ark/pagination.blade.php create mode 100644 resources/views/vendor/hermes/navbar-notifications.blade.php create mode 100644 routes/api.php create mode 100644 routes/channels.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 server.php create mode 100644 storage/app/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/token-config/.gitignore create mode 100644 tailwind.config.js create mode 100644 tests/Analysis/AnalysisTest.php create mode 100644 tests/App/Collaborator/Components/CollaboratorPermissionsModalTest.php create mode 100644 tests/App/Collaborator/Components/DeclineInvitationModalTest.php create mode 100644 tests/App/Collaborator/Components/DeleteCollaboratorTest.php create mode 100644 tests/App/Collaborator/Components/InviteCollaboratorTest.php create mode 100644 tests/App/Collaborator/Components/LeaveTeamModalTest.php create mode 100644 tests/App/Collaborator/Components/MailedInvitationsTest.php create mode 100644 tests/App/Collaborator/Components/ManageCollaboratorsTest.php create mode 100644 tests/App/Collaborator/Components/UpdateCollaboratorTest.php create mode 100644 tests/App/Collaborator/Mail/InviteExistingUserTest.php create mode 100644 tests/App/Collaborator/Mail/InviteNewUserTest.php create mode 100644 tests/App/Collaborator/Notifications/CollaboratorAcceptedInviteTest.php create mode 100644 tests/App/Collaborator/Notifications/CollaboratorDeclinedInviteTest.php create mode 100644 tests/App/Console/Commands/CheckRemoteServerExistenceTest.php create mode 100644 tests/App/Console/Commands/IndexServerProviderImagesTest.php create mode 100644 tests/App/Console/Commands/IndexServerProviderPlansTest.php create mode 100644 tests/App/Console/Commands/IndexServerProviderRegionsTest.php create mode 100644 tests/App/Console/Commands/Jobs/MaintainServerProviderKeyTest.php create mode 100644 tests/App/Console/Commands/Jobs/PingServerTest.php create mode 100644 tests/App/Console/Commands/Jobs/RemoteServerExistenceTest.php create mode 100644 tests/App/Console/Commands/Jobs/SyncServerRemoteAddressTest.php create mode 100644 tests/App/Console/Commands/MaintainInvitationsTest.php create mode 100644 tests/App/Console/Commands/MaintainServerProviderKeysTest.php create mode 100644 tests/App/Console/Commands/PingRemoteServersTest.php create mode 100644 tests/App/Console/Commands/PurgeServersWithFailedDeploymentsTest.php create mode 100644 tests/App/Console/Commands/SyncServerRemoteAddressesTest.php create mode 100644 tests/App/Enums/NetworkTypeEnumTest.php create mode 100644 tests/App/Enums/ServerProviderTypeEnumTest.php create mode 100644 tests/App/Http/Components/DownloadInstallScriptTest.php create mode 100644 tests/App/Http/Components/ManageWelcomeScreensTest.php create mode 100644 tests/App/Http/Components/Modals/BetaNoticeTest.php create mode 100644 tests/App/Http/Components/UseDefaultsModalTest.php create mode 100644 tests/App/Listeners/FlushMediaCacheTest.php create mode 100644 tests/App/SecureShell/Components/CreateSecureShellKeyTest.php create mode 100644 tests/App/SecureShell/Components/DeleteSecureShellKeyTest.php create mode 100644 tests/App/SecureShell/Jobs/AddSecureShellKeyToServerProviderTest.php create mode 100644 tests/App/SecureShell/Jobs/RemoveSecureShellKeyFromServerProviderTest.php create mode 100644 tests/App/Server/Components/CreateServerTest.php create mode 100644 tests/App/Server/Components/DeleteServerProviderTest.php create mode 100644 tests/App/Server/Components/DeleteServerTest.php create mode 100644 tests/App/Server/Components/ManageServerConfigurationTest.php create mode 100644 tests/App/Server/Components/ManageServerProvidersTest.php create mode 100644 tests/App/Server/Components/RedirectOnServerProviderCompletionTest.php create mode 100644 tests/App/Server/Components/RenameServerTest.php create mode 100644 tests/App/Server/Components/ServerDeploymentTrackerTest.php create mode 100644 tests/App/Server/Controllers/DeploymentStatusControllerTest.php create mode 100644 tests/App/Server/Jobs/CreateServerOnProviderTest.php create mode 100644 tests/App/Server/Jobs/DestroyServerOnServerProviderTest.php create mode 100644 tests/App/Server/Jobs/IndexServerProviderImagesTest.php create mode 100644 tests/App/Server/Jobs/IndexServerProviderPlansTest.php create mode 100644 tests/App/Server/Jobs/IndexServerProviderRegionsTest.php create mode 100644 tests/App/Server/Jobs/ProvisionServerTest.php create mode 100644 tests/App/Server/Jobs/ProvisionUserTest.php create mode 100644 tests/App/Server/Jobs/RemovePasswordsFromServerTest.php create mode 100644 tests/App/Server/Jobs/ServerProvisionerTest.php create mode 100644 tests/App/Server/Jobs/WaitForServerToStartTest.php create mode 100644 tests/App/Server/Notifications/IndexServerProviderImagesFailedTest.php create mode 100644 tests/App/Server/Notifications/IndexServerProviderPlansFailedTest.php create mode 100644 tests/App/Server/Notifications/IndexServerProviderRegionsFailedTest.php create mode 100644 tests/App/Server/Notifications/RemoteServerLimitReachedTest.php create mode 100644 tests/App/Server/Notifications/ServerDeletedTest.php create mode 100644 tests/App/Server/Notifications/ServerDeployedTest.php create mode 100644 tests/App/Server/Notifications/ServerFailedDeploymentTest.php create mode 100644 tests/App/Server/Notifications/ServerFailedToCreateOnProviderTest.php create mode 100644 tests/App/Server/Notifications/ServerProviderAuthenticationFailedTest.php create mode 100644 tests/App/Server/Notifications/ServerProviderSecureShellKeyAdditionFailedTest.php create mode 100644 tests/App/Server/Notifications/ServerProviderSecureShellKeyLimitReachedTest.php create mode 100644 tests/App/Server/Notifications/ServerProviderSecureShellKeyRemovalFailedTest.php create mode 100644 tests/App/Server/Notifications/ServerProviderSecureShellKeyUniquenessTest.php create mode 100644 tests/App/Server/Notifications/ServerProviderServerRemovalFailedTest.php create mode 100644 tests/App/Server/Notifications/ServerProvisionedTest.php create mode 100644 tests/App/Server/Notifications/ServerUnreachableTest.php create mode 100644 tests/App/Server/Requests/DeploymentConfigRequestTest.php create mode 100644 tests/App/Server/Requests/StoreServerProviderRequestTest.php create mode 100644 tests/App/Server/Resources/PlanResourceTest.php create mode 100644 tests/App/Server/Resources/RegionResourceTest.php create mode 100644 tests/App/Token/Components/ActiveServersTest.php create mode 100644 tests/App/Token/Components/CreateTokenModalTest.php create mode 100644 tests/App/Token/Components/DeleteTokenTest.php create mode 100644 tests/App/Token/Components/DeployBlockchainTest.php create mode 100644 tests/App/Token/Components/LogoUploadTest.php create mode 100644 tests/App/Token/Components/ManageTokenSecureShellKeysTest.php create mode 100644 tests/App/Token/Components/ManageTokensTest.php create mode 100644 tests/App/Token/Components/UpdateTokenTest.php create mode 100644 tests/App/Token/Controllers/DeploymentConfigControllerTest.php create mode 100644 tests/App/Token/Controllers/InstallationScriptControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenActivityControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenCollaboratorControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenDetailsControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenInvitationControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenOnboardingControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenSecureShellKeyControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenServerActionControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenServerConfigurationControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenServerControllerTest.php create mode 100644 tests/App/Token/Controllers/TokenServerProviderControllerTest.php create mode 100644 tests/App/Token/Notifications/TokenDeletedTest.php create mode 100644 tests/App/User/Components/ManageSecureShellKeysTest.php create mode 100644 tests/App/User/Components/UpdateUserAccountTest.php create mode 100644 tests/App/User/Mail/ConfirmEmailChangeTest.php create mode 100644 tests/App/User/Mail/PersonalDataExportTest.php create mode 100644 tests/App/View/Components/SortByButtonTest.php create mode 100644 tests/Browser/Components/Crop.php create mode 100644 tests/Browser/LoginTest.php create mode 100644 tests/Browser/OnboardingStepsTest.php create mode 100644 tests/Browser/Pages/HomePage.php create mode 100644 tests/Browser/Pages/Page.php create mode 100644 tests/Browser/RegisterTest.php create mode 100644 tests/Browser/SelectSshKeysTest.php create mode 100644 tests/Browser/ServerConfigurationTest.php create mode 100644 tests/Browser/SetServerProviderTest.php create mode 100644 tests/Browser/TokenEditTest.php create mode 100644 tests/Browser/console/.gitignore create mode 100644 tests/Browser/screenshots/.gitignore create mode 100644 tests/Concerns/CreatesModels.php create mode 100644 tests/CreatesApplication.php create mode 100644 tests/Domain/Coin/Models/CoinTest.php create mode 100644 tests/Domain/Collaborator/Actions/InviteCollaboratorActionTest.php create mode 100644 tests/Domain/Collaborator/Models/CollaboratorTest.php create mode 100644 tests/Domain/Collaborator/Models/InvitationTest.php create mode 100644 tests/Domain/SecureShell/Models/SecureShellKeyTest.php create mode 100644 tests/Domain/SecureShell/Policies/SecureShellKeyPolicyTest.php create mode 100644 tests/Domain/SecureShell/Rules/SecureShellKeyTest.php create mode 100644 tests/Domain/SecureShell/Scripts/Concerns/LocatestScriptTest.php create mode 100644 tests/Domain/SecureShell/Scripts/ManualScriptTest.php create mode 100644 tests/Domain/SecureShell/Scripts/ProvisionExplorerTest.php create mode 100644 tests/Domain/SecureShell/Scripts/ProvisionForgerTest.php create mode 100644 tests/Domain/SecureShell/Scripts/ProvisionGenesisTest.php create mode 100644 tests/Domain/SecureShell/Scripts/ProvisionRelayTest.php create mode 100644 tests/Domain/SecureShell/Scripts/ProvisionSeedTest.php create mode 100644 tests/Domain/SecureShell/Scripts/ProvisionUserTest.php create mode 100644 tests/Domain/SecureShell/Services/Concerns/GetCurrentDirectory.php create mode 100644 tests/Domain/SecureShell/Services/Concerns/ScriptWithUserSwitch.php create mode 100644 tests/Domain/SecureShell/Services/SecureShellCommandTest.php create mode 100644 tests/Domain/SecureShell/Services/SecureShellKeyTest.php create mode 100644 tests/Domain/SecureShell/Services/SecureShellTest.php create mode 100644 tests/Domain/SecureShell/Services/ShellProcessRunnerTest.php create mode 100644 tests/Domain/SecureShell/Services/ShellResponseTest.php create mode 100644 tests/Domain/Server/Enums/PresetTypeEnumTest.php create mode 100644 tests/Domain/Server/Enums/ServerDeploymentStatusTest.php create mode 100644 tests/Domain/Server/Enums/ServerTaskStatusEnumTest.php create mode 100644 tests/Domain/Server/Models/ServerProviderImageTest.php create mode 100644 tests/Domain/Server/Models/ServerProviderPlanTest.php create mode 100644 tests/Domain/Server/Models/ServerProviderRegionTest.php create mode 100644 tests/Domain/Server/Models/ServerProviderTest.php create mode 100644 tests/Domain/Server/Models/ServerTaskTest.php create mode 100644 tests/Domain/Server/Models/ServerTest.php create mode 100644 tests/Domain/Server/Policies/ServerPolicyTest.php create mode 100644 tests/Domain/Server/Policies/ServerProviderPolicyTest.php create mode 100644 tests/Domain/Server/Services/Providers/AWSExceptionHandlerTest.php create mode 100644 tests/Domain/Server/Services/Providers/DigitalOceanExceptionHandlerTest.php create mode 100644 tests/Domain/Server/Services/Providers/DigitalOceanTest.php create mode 100644 tests/Domain/Server/Services/Providers/HetznerExceptionHandlerTest.php create mode 100644 tests/Domain/Server/Services/Providers/HetznerTest.php create mode 100644 tests/Domain/Server/Services/Providers/LinodeExceptionHandlerTest.php create mode 100644 tests/Domain/Server/Services/Providers/LinodeTest.php create mode 100644 tests/Domain/Server/Services/Providers/VultrExceptionHandlerTest.php create mode 100644 tests/Domain/Server/Services/Providers/VultrTest.php create mode 100644 tests/Domain/Server/Services/ServerProviderClientFactoryTest.php create mode 100644 tests/Domain/Server/Support/Rules/ValidAWSServerNameTest.php create mode 100644 tests/Domain/Server/Support/Rules/ValidDigitalOceanServerNameTest.php create mode 100644 tests/Domain/Server/Support/Rules/ValidHetznerServerNameTest.php create mode 100644 tests/Domain/Server/Support/Rules/ValidLinodeServerNametTest.php create mode 100644 tests/Domain/Server/Support/Rules/ValidVultrServerNameTest.php create mode 100644 tests/Domain/Token/Enums/TokenStatusEnumTest.php create mode 100644 tests/Domain/Token/Events/NetworkCreatedTest.php create mode 100644 tests/Domain/Token/Events/ServerCreatedTest.php create mode 100644 tests/Domain/Token/Events/ServerDeletedTest.php create mode 100644 tests/Domain/Token/Events/ServerProviderCreatedTest.php create mode 100644 tests/Domain/Token/Events/ServerProviderDeletedTest.php create mode 100644 tests/Domain/Token/Events/ServerProviderUpdatedTest.php create mode 100644 tests/Domain/Token/Events/TokenCreatedTest.php create mode 100644 tests/Domain/Token/Events/TokenDeletedTest.php create mode 100644 tests/Domain/Token/Listeners/ServerCreated/CreateServerOnProviderTest.php create mode 100644 tests/Domain/Token/Listeners/ServerDeleted/DestroyServerOnServerProviderTest.php create mode 100644 tests/Domain/Token/Listeners/ServerDeleted/NotifyUsersOfServerDeletionTest.php create mode 100644 tests/Domain/Token/Listeners/ServerProviderUpdated/IndexServerProviderRelatedDataTest.php create mode 100644 tests/Domain/Token/Listeners/ServerUpdating/UpdateServerProviderNameTest.php create mode 100644 tests/Domain/Token/Listeners/TokenCreated/CreateDefaultNetworksTest.php create mode 100644 tests/Domain/Token/Listeners/TokenDeleted/NotifyCollaboratorsTest.php create mode 100644 tests/Domain/Token/Listeners/TokenDeleted/PurgeTokenResourcesTest.php create mode 100644 tests/Domain/Token/Listeners/TokenDeleted/RemoveActionsFromTokenNotificationsTest.php create mode 100644 tests/Domain/Token/Models/NetworkTest.php create mode 100644 tests/Domain/Token/Models/TokenTest.php create mode 100644 tests/Domain/Token/Policies/TokenPolicyTest.php create mode 100644 tests/Domain/Token/Rules/UniqueTokenExtraAttributeTest.php create mode 100644 tests/Domain/User/Models/DatabaseNotificationTest.php create mode 100644 tests/Domain/User/Models/UserTest.php create mode 100644 tests/Domain/User/Observers/UserObserverTest.php create mode 100644 tests/DuskTestCase.php create mode 100644 tests/Helpers.php create mode 100644 tests/Pest.php create mode 100644 tests/Plugins/Encryption/FakeEncrypter.php create mode 100644 tests/Support/AddressPrefixesTest.php create mode 100644 tests/Support/Builders/NotificationBuilderTest.php create mode 100644 tests/Support/Components/YoutubeModalsTest.php create mode 100644 tests/Support/Helpers/FormatTest.php create mode 100644 tests/Support/Http/Middleware/AuthenticateTest.php create mode 100644 tests/Support/Http/Middleware/RedirectIfAuthenticatedTest.php create mode 100644 tests/Support/Http/Middleware/RedirectIfOnboardingTest.php create mode 100644 tests/Support/Http/Middleware/ThrottleWithSessionTokenTest.php create mode 100644 tests/Support/Rules/AddressPrefixTest.php create mode 100644 tests/Support/Rules/BIP39PassphraseTest.php create mode 100644 tests/Support/Rules/PortTest.php create mode 100644 tests/Support/Services/ActivityLoggerTest.php create mode 100644 tests/Support/Services/HaikuTest.php create mode 100644 tests/Support/Services/JsonTest.php create mode 100644 tests/Support/Services/OnboardingManagerTest.php create mode 100644 tests/Support/Services/PasswordGeneratorTest.php create mode 100644 tests/TestCase.php create mode 100755 tests/bootstrap.php create mode 100644 tests/fixtures/ark/syncing.json create mode 100644 tests/fixtures/avatar.jpg create mode 100644 tests/fixtures/bitbucket/keys.json create mode 100644 tests/fixtures/bitbucket/repo-exists.json create mode 100644 tests/fixtures/bitbucket/repo.json create mode 100644 tests/fixtures/bitbucket/user.json create mode 100644 tests/fixtures/config.json create mode 100644 tests/fixtures/crypto/genesis-block.json create mode 100644 tests/fixtures/crypto/genesis-delegate-registration.json create mode 100644 tests/fixtures/crypto/genesis-transfer.json create mode 100644 tests/fixtures/crypto/wallet.json create mode 100644 tests/fixtures/details.json create mode 100644 tests/fixtures/digitalocean/account.json create mode 100644 tests/fixtures/digitalocean/create-exceeded.json create mode 100644 tests/fixtures/digitalocean/create.json create mode 100644 tests/fixtures/digitalocean/errored-general.json create mode 100644 tests/fixtures/digitalocean/images.json create mode 100644 tests/fixtures/digitalocean/plans.json create mode 100644 tests/fixtures/digitalocean/reboot.json create mode 100644 tests/fixtures/digitalocean/regions.json create mode 100644 tests/fixtures/digitalocean/rename.json create mode 100644 tests/fixtures/digitalocean/server-not-found.json create mode 100644 tests/fixtures/digitalocean/server.json create mode 100644 tests/fixtures/digitalocean/ssh-key-create-failed.json create mode 100644 tests/fixtures/digitalocean/ssh-keys-create.json create mode 100644 tests/fixtures/digitalocean/ssh-keys-get.json create mode 100644 tests/fixtures/digitalocean/start.json create mode 100644 tests/fixtures/digitalocean/stop.json create mode 100644 tests/fixtures/digitalocean/too-many-requests.json create mode 100644 tests/fixtures/digitalocean/unauthorized.json create mode 100644 tests/fixtures/github/create-branch.json create mode 100644 tests/fixtures/github/create-pull-request.json create mode 100644 tests/fixtures/github/get-branch.json create mode 100644 tests/fixtures/github/get-file.json create mode 100644 tests/fixtures/github/keys.json create mode 100644 tests/fixtures/github/repo-exists.json create mode 100644 tests/fixtures/github/repo.json create mode 100644 tests/fixtures/github/update-file.json create mode 100644 tests/fixtures/github/update-repository.json create mode 100644 tests/fixtures/github/user.json create mode 100644 tests/fixtures/gitlab/create-branch.json create mode 100644 tests/fixtures/gitlab/create-pull-request.json create mode 100644 tests/fixtures/gitlab/get-branch.json create mode 100644 tests/fixtures/gitlab/get-file.json create mode 100644 tests/fixtures/gitlab/keys.json create mode 100644 tests/fixtures/gitlab/repo-exists.json create mode 100644 tests/fixtures/gitlab/repo.json create mode 100644 tests/fixtures/gitlab/update-file.json create mode 100644 tests/fixtures/gitlab/user.json create mode 100644 tests/fixtures/hetzner/core-limit-exceeded.json create mode 100644 tests/fixtures/hetzner/create-exceeded.json create mode 100644 tests/fixtures/hetzner/create.json create mode 100644 tests/fixtures/hetzner/delete.json create mode 100644 tests/fixtures/hetzner/errored-general.json create mode 100644 tests/fixtures/hetzner/images-without-name.json create mode 100644 tests/fixtures/hetzner/images.json create mode 100644 tests/fixtures/hetzner/method-not-allowed.json create mode 100644 tests/fixtures/hetzner/plans.json create mode 100644 tests/fixtures/hetzner/reboot.json create mode 100644 tests/fixtures/hetzner/regions.json create mode 100644 tests/fixtures/hetzner/rename.json create mode 100644 tests/fixtures/hetzner/server-not-found.json create mode 100644 tests/fixtures/hetzner/server.json create mode 100644 tests/fixtures/hetzner/ssh-keys-create.json create mode 100644 tests/fixtures/hetzner/ssh-keys-get.json create mode 100644 tests/fixtures/hetzner/ssh-keys-uniqueness-error.json create mode 100644 tests/fixtures/hetzner/start.json create mode 100644 tests/fixtures/hetzner/stop.json create mode 100644 tests/fixtures/hetzner/unable-to-authenticate.json create mode 100644 tests/fixtures/linode/account.json create mode 100644 tests/fixtures/linode/create-exceeded.json create mode 100644 tests/fixtures/linode/create.json create mode 100644 tests/fixtures/linode/images.json create mode 100644 tests/fixtures/linode/plans.json create mode 100644 tests/fixtures/linode/regions.json create mode 100644 tests/fixtures/linode/server-not-found.json create mode 100644 tests/fixtures/linode/server.json create mode 100644 tests/fixtures/linode/ssh-keys-create.json create mode 100644 tests/fixtures/linode/ssh-keys-get.json create mode 100644 tests/fixtures/linode/update.json create mode 100644 tests/fixtures/vultr/account.json create mode 100644 tests/fixtures/vultr/create-exceeded.json create mode 100644 tests/fixtures/vultr/create.json create mode 100644 tests/fixtures/vultr/images.json create mode 100644 tests/fixtures/vultr/plans.json create mode 100644 tests/fixtures/vultr/regions.json create mode 100644 tests/fixtures/vultr/server-not-found.json create mode 100644 tests/fixtures/vultr/server.json create mode 100644 tests/fixtures/vultr/ssh-keys-create.json create mode 100644 tests/fixtures/vultr/ssh-keys-get.json create mode 100644 webpack.mix.js create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..aecc3bc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 4 diff --git a/.env.dusk b/.env.dusk new file mode 100644 index 0000000..27d89da --- /dev/null +++ b/.env.dusk @@ -0,0 +1,47 @@ +APP_NAME=Deployer +APP_ENV=dusk +APP_KEY=base64:PrEuajG9mhMu48SDXAKd8xrIMyujCQG+HbDV0U+MjRY= +APP_DEBUG=true +APP_URL=http://127.0.0.1:8000 + +LOG_CHANNEL=stack + +DB_CONNECTION=pgsql +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_DATABASE=homestead +DB_USERNAME=homestead +DB_PASSWORD=password + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_HOST=smtp.mailtrap.io +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS=null +MAIL_FROM_NAME="${APP_NAME}" + +SENTRY_LARAVEL_DSN= + +RESPONSE_CACHE_ENABLED=false +RESPONSE_CACHE_DRIVER=redis + +RECAPTCHA_SITE= +RECAPTCHA_SECRET= + +TELESCOPE_ENABLED=false + +DEMO_MODE_ENABLED=false +DEBUGBAR_ENABLED=false +ENABLE_COOKIECONSENT=false diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7036237 --- /dev/null +++ b/.env.example @@ -0,0 +1,56 @@ +APP_NAME=Deployer +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://deployer.test + +LOG_CHANNEL=stack + +DB_CONNECTION=pgsql +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_DATABASE=deployer +DB_USERNAME=deployer +DB_PASSWORD= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=smtp.mailtrap.io +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS=null +MAIL_FROM_NAME="${APP_NAME}" + +SENTRY_LARAVEL_DSN= + +RESPONSE_CACHE_ENABLED=false +RESPONSE_CACHE_DRIVER=redis + +RECAPTCHA_SITE= +RECAPTCHA_SECRET= + +FAKEID_PRIME=1601895473 +FAKEID_INVERSE=1212079313 +FAKEID_RANDOM=360160081 + +GOOGLE_ANALYTICS_TRACKING_KEY=G- +# Optional, used to remove the google analytics cookies that are stored within +# the site domain, only neccesary if you are running the app in a subdomain +# `dev.deployer.io` should use `deployer.io` +# or `deployer.io.test` should use `io.test` +GOOGLE_ANALYTICS_COOKIE_DOMAIN= + +ZENDESK_SUBDOMAIN= +ZENDESK_USERNAME= +ZENDESK_TOKEN= diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..9f03390 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "extends": ["eslint:recommended", "plugin:vue/essential"], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly", + "route": true, + "require": true + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "plugins": ["vue"], + "rules": {} +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..967315d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto +*.css linguist-vendored +*.scss linguist-vendored +*.js linguist-vendored +CHANGELOG.md export-ignore diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..8858ad2 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,30 @@ + + +## Summary + + + + + + + +## Checklist + + + +- [ ] I checked my UI changes against the design and there are no notable differences +- [ ] I checked my UI changes for any responsiveness issues +- [ ] I checked my (code) changes for obvious issues, debug statements and commented code +- [ ] I opened a corresponding card on Clickup for any remaining TODOs in my code +- [ ] I added a short description on how to test this PR _(if necessary)_ +- [ ] Documentation _(if necessary)_ +- [ ] Tests _(if necessary)_ +- [ ] Ready to be merged + + diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000..94bd2ec --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,23 @@ +version: 1 + +labels: + - label: "bugfix" + title: "^fix.*" + - label: "feature" + title: "^feat.*" + - label: "build" + title: "^build.*" + - label: "chore" + title: "^chore.*" + - label: "ci" + title: "^ci.*" + - label: "docs" + title: "^docs.*" + - label: "style" + title: "^style.*" + - label: "refactor" + title: "^refactor.*" + - label: "performance" + title: "^perf.*" + - label: "test" + title: "^test.*" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e40912a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,207 @@ +name: CI + +on: + push: + branches: + - "master" + - "develop" + pull_request: + types: [ready_for_review, synchronize, opened] + +jobs: + conflicts: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + + - name: Merge Conflict finder + uses: olivernybroe/action-conflict-finder@v4.0 + + analyse: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.1" + extensions: mbstring, dom, fileinfo, intl, gd, imagick, bcmath, soap, zip, sqlite, pcov + coverage: pcov + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ~/.composer/cache/files + key: dependencies-composer-${{ hashFiles('composer.json') }} + + - name: Install Composer dependencies + run: composer install --no-ansi --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs + + - name: Prepare the application + run: cp .env.example .env && php artisan key:generate + + - name: Run PHPStan + run: composer analyse + + format: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_TOKEN }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.1" + extensions: mbstring, dom, fileinfo, intl, gd, imagick, bcmath, soap, zip, sqlite, pcov + coverage: pcov + + - name: Install + run: composer install --no-ansi --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs + + - name: Run php-cs-fixer + run: PHP_CS_FIXER_IGNORE_ENV=true composer format + + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: "style: resolve style guide violations" + branch: ${{ github.head_ref }} + + unit: + needs: [conflicts, analyse, format] + + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:12 + env: + POSTGRES_DB: deployer + POSTGRES_USER: deployer + POSTGRES_PASSWORD: password + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.1" + extensions: mbstring, dom, fileinfo, intl, gd, imagick, bcmath, soap, zip, sqlite, pcov + coverage: pcov + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ~/.composer/cache/files + key: dependencies-composer-${{ hashFiles('composer.json') }} + + - name: Install Composer dependencies + run: composer install --no-ansi --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs + + - name: Prepare the application + run: cp .env.example .env && php artisan key:generate + + - name: Clear Config + run: php artisan config:clear && php artisan route:clear + + - name: Run Tests + run: composer test:coverage + env: + DB_CONNECTION: pgsql + DB_HOST: 127.0.0.1 + DB_PORT: 5432 + DB_DATABASE: deployer + DB_USERNAME: deployer + DB_PASSWORD: password + + # e2e: + # needs: [conflicts, analyse, format] + + # runs-on: ubuntu-latest + + # services: + # postgres: + # image: postgres:12 + # env: + # POSTGRES_DB: homestead + # POSTGRES_USER: homestead + # POSTGRES_PASSWORD: password + # ports: + # - 5432:5432 + # options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + + # steps: + # - name: Checkout code + # uses: actions/checkout@v3 + + # - name: Setup PHP + # uses: shivammathur/setup-php@v2 + # with: + # php-version: "8.0" + # extensions: mbstring, dom, fileinfo, intl, gd, imagick, bcmath, soap, zip, sqlite, pcov + # coverage: pcov + + # - name: Cache dependencies + # uses: actions/cache@v3 + # with: + # path: ~/.composer/cache/files + # key: dependencies-composer-${{ hashFiles('composer.json') }} + + # - name: Install Composer dependencies + # run: composer install --no-ansi --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs + + # - name: Prepare the application + # run: cp .env.dusk .env + + # - name: Generate Application Key + # run: php artisan key:generate + + # - name: Upgrade Chrome Driver + # run: php artisan dusk:chrome-driver `/opt/google/chrome/chrome --version | cut -d " " -f3 | cut -d "." -f1` + + # - name: Start Chrome Driver + # run: ./vendor/laravel/dusk/bin/chromedriver-linux & + + # - name: Run Laravel Server + # run: php artisan serve & + + # - name: Run Dusk Tests + # run: php artisan dusk + + # - name: Upload Screenshots + # uses: actions/upload-artifact@v1 + # if: failure() + # with: + # name: dusk-screenshots + # path: tests/Browser/screenshots + + # - name: Upload Console + # uses: actions/upload-artifact@v1 + # if: failure() + # with: + # name: dusk-console + # path: tests/Browser/console + + # - name: Upload Logs + # uses: actions/upload-artifact@v1 + # if: failure() + # with: + # name: dusk-logs + # path: storage/logs diff --git a/.github/workflows/deps.yml b/.github/workflows/deps.yml new file mode 100644 index 0000000..85e827b --- /dev/null +++ b/.github/workflows/deps.yml @@ -0,0 +1,87 @@ +name: Dependencies + +on: + schedule: + - cron: '0 0 * * 0' + workflow_dispatch: + +jobs: + php: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_TOKEN }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + extensions: mbstring, dom, fileinfo, intl, gd, imagick, bcmath, soap, zip, sqlite + coverage: none + + - name: Update PHP dependencies + run: npx @faustbrian/node-composer-check-updates --caret-minor + + - name: Install PHP dependencies + run: composer update --no-ansi --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs + + - name: Install JS dependencies + run: yarn --ignore-engines + + - name: Rebuild assets + run: yarn prod + + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GH_TOKEN }} + commit-message: 'chore: update PHP dependencies' + committer: GitHub + author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + branch: chore/update-php-dependencies + delete-branch: true + title: 'chore: update PHP dependencies' + draft: false + + js: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_TOKEN }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + extensions: mbstring, dom, fileinfo, intl, gd, imagick, bcmath, soap, zip, sqlite + coverage: none + + - name: Install PHP dependencies + run: composer install --no-ansi --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs + + - name: Update JS dependencies + run: npx npm-check-updates --configFilePath ./vendor/arkecosystem/foundation/ + + - name: Install Updated JS dependencies + run: yarn --ignore-engines + + - name: Rebuild assets + run: yarn prod + + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GH_TOKEN }} + commit-message: 'chore: update JavaScript dependencies' + committer: GitHub + author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + branch: chore/update-javascript-dependencies + delete-branch: true + title: 'chore: update JavaScript dependencies' + draft: false diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml new file mode 100644 index 0000000..5fb806c --- /dev/null +++ b/.github/workflows/label.yml @@ -0,0 +1,19 @@ +name: Labels + +on: + pull_request: + types: [ready_for_review, synchronize, opened] + +jobs: + assign: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + + - uses: srvaroa/labeler@master + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml new file mode 100644 index 0000000..f0bbed3 --- /dev/null +++ b/.github/workflows/ui.yml @@ -0,0 +1,73 @@ +name: UI + +on: + pull_request: + paths: + - '**.css' + - '**.js' + - '**.php' + - '**.svg' + +jobs: + prettier: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_TOKEN }} + + - name: Install + run: yarn install --frozen-lockfile + + - name: Run prettier + run: yarn run prettier --write 'resources/**/*.{css,js,vue}' + + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'style: resolve style guide violations' + branch: ${{ github.head_ref }} + + rustywind: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_TOKEN }} + + - name: Format + run: | + export PATH="$(yarn global bin):$PATH" + yarn global add rustywind + rustywind --write resources/views + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'style: resolve style guide violations' + branch: ${{ github.head_ref }} + + svg: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_TOKEN }} + + - name: Optimize SVGs + uses: ericcornelissen/svgo-action@v3 + id: svgo + with: + ignore: public/vendor/**/*.svg + repo-token: ${{ secrets.GH_TOKEN }} + svgo-config: .svgo.js + + - name: Commit optimizations + uses: stefanzweifel/git-auto-commit-action@v4 + if: ${{steps.svgo.outputs.DID_OPTIMIZE}} + with: + commit_message: Optimize ${{steps.svgo.outputs.OPTIMIZED_COUNT}} SVG(s) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d10de2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +_ide_helper_models.php +_ide_helper.php +.coverage +.env +.env.dusk.local +.idea/ +.php-cs-fixer.cache +.phpstorm.meta.php +.phpunit.result.cache +*.sqlite +**/.DS_Store +/node_modules +/public/hot +/storage/*.key +/vendor +coverage.xml +database/*.sqlite +error_log +Homestead.json +Homestead.yaml +npm-debug.log +package-lock.json +yarn-error.log +auth.json diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 0000000..ff4e8d8 --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,3 @@ +{ + "resources/js/**/*.js": ["npm run prod"] +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..0daad86 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +public/ +vendor/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..46124e3 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 120, + "singleQuote": true, + "tabWidth": 4, + "trailingComma": "es5" +} diff --git a/.svgo.js b/.svgo.js new file mode 100644 index 0000000..7eeb0c0 --- /dev/null +++ b/.svgo.js @@ -0,0 +1,16 @@ +module.exports = { +plugins: [ + { + name: 'preset-default', + params: { + overrides: { + cleanupIDs: { + preservePrefixes: [ + 'keep_', + ], + }, + } + } + }, +], +}; diff --git a/.svgo.yml b/.svgo.yml new file mode 100644 index 0000000..9d7c83f --- /dev/null +++ b/.svgo.yml @@ -0,0 +1,2 @@ +plugins: + - cleanupIDs: false \ No newline at end of file diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..806b117 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @faustbrian @ItsANameToo @samharperpittam @alexbarnsley diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..810fce6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,621 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS diff --git a/app/App/BaseApplication.php b/app/App/BaseApplication.php new file mode 100644 index 0000000..c3eadfa --- /dev/null +++ b/app/App/BaseApplication.php @@ -0,0 +1,17 @@ +basePath.DIRECTORY_SEPARATOR.'app/App'.($path !== '' ? DIRECTORY_SEPARATOR.$path : $path); + } +} diff --git a/app/App/Collaborator/Components/CollaboratorPermissionsModal.php b/app/App/Collaborator/Components/CollaboratorPermissionsModal.php new file mode 100644 index 0000000..56b0a22 --- /dev/null +++ b/app/App/Collaborator/Components/CollaboratorPermissionsModal.php @@ -0,0 +1,34 @@ + 'setPermissions']; + + public function setPermissions(array $permissions): void + { + $this->permissions = $permissions; + + $this->openModal(); + } + + public function getAvailablePermissionsProperty(): Collection + { + return collect(Collaborator::availablePermissions()); + } +} diff --git a/app/App/Collaborator/Components/DeclineInvitationModal.php b/app/App/Collaborator/Components/DeclineInvitationModal.php new file mode 100644 index 0000000..047dd53 --- /dev/null +++ b/app/App/Collaborator/Components/DeclineInvitationModal.php @@ -0,0 +1,65 @@ + 'showModal']; + + public function showModal(int $id): void + { + $this->invitationId = $id; + $this->invitation = Invitation::find($id); + } + + public function close(): void + { + $this->invitationId = null; + + $this->modalClosed(); + } + + public function decline(): Redirector|RedirectResponse + { + $request = request(); + if (! TokenInvitationController::canBeHandled($request, $this->invitation)) { + return redirect()->route('user.teams'); + } + + /** @var Token $token */ + $token = $this->invitation?->token; + + $this->invitation?->delete(); + + alert('invitations.messages.decline_invitation', FlashType::SUCCESS); + + /** @var User $user */ + $user = $request->user(); + + $token->user->notify(new CollaboratorDeclinedInvite($token, $user)); + + return redirect()->route('user.teams')->with('status', TokenInvitationController::ALERT_STATUS); + } +} diff --git a/app/App/Collaborator/Components/DeleteCollaborator.php b/app/App/Collaborator/Components/DeleteCollaborator.php new file mode 100644 index 0000000..86fbc4c --- /dev/null +++ b/app/App/Collaborator/Components/DeleteCollaborator.php @@ -0,0 +1,69 @@ + 'askForConfirmation']; + + public function askForConfirmation(int $id): void + { + $this->collaboratorId = $id; + $this->name = User::findOrFail($id)->name; + } + + public function destroy(): void + { + $this->authorize('deleteCollaborator', $this->token); + + $collaborator = User::findOrFail($this->collaboratorId); + + abort_unless($this->canBeRemoved($collaborator), 403); + + $this->token->stopSharingWith($collaborator); + + $this->reset(); + + $this->emit('refreshCollaborators'); + + $this->toast(trans('tokens.collaborators.removed'), 'success'); + + $this->modalClosed(); + } + + public function close(): void + { + $this->collaboratorId = null; + $this->name = null; + + $this->modalClosed(); + } + + private function canBeRemoved(User $collaborator): bool + { + return $this->user->id !== $collaborator->id && $collaborator->id !== $this->token->user->id; + } +} diff --git a/app/App/Collaborator/Components/InviteCollaborator.php b/app/App/Collaborator/Components/InviteCollaborator.php new file mode 100644 index 0000000..9c8d023 --- /dev/null +++ b/app/App/Collaborator/Components/InviteCollaborator.php @@ -0,0 +1,52 @@ +authorize('createCollaborator', $this->token); + + $data = $this->validate([ + 'email' => ['required', 'email', 'max:255'], + 'permissions' => ['required', 'array'], + 'permissions.*' => ['required', 'string', Rule::in($this->getAvailablePermissionsProperty()->toArray())], + ]); + + resolve(InviteCollaboratorAction::class)($this->token, strtolower($data['email']), $this->permissions); + + $this->email = null; + $this->permissions = []; + + $this->emit('refreshCollaborators'); + + $this->toast(trans('tokens.invitation_sent')); + } + + public function getAvailablePermissionsProperty(): Collection + { + return collect(Collaborator::availablePermissions()); + } +} diff --git a/app/App/Collaborator/Components/LeaveTeamModal.php b/app/App/Collaborator/Components/LeaveTeamModal.php new file mode 100644 index 0000000..bbc7e4d --- /dev/null +++ b/app/App/Collaborator/Components/LeaveTeamModal.php @@ -0,0 +1,62 @@ + 'showModal']; + + public function showModal(int $id): void + { + $this->tokenId = $id; + $this->token = Token::find($id); + } + + public function close(): void + { + $this->tokenId = null; + + $this->closeModal(); + } + + public function leave(): Redirector|RedirectResponse + { + /** @var ?User */ + $user = $this->user; + + if ($user !== null && $this->token !== null && ! $user->ownsToken($this->token)) { + $this->token->stopSharingWith($user); + } + + $this->tokenId = null; + + $this->closeModal(); + + alert('tokens.messages.left_team', FlashType::SUCCESS, ['team' => $this->token?->name]); + + return redirect()->route('user.teams')->with('status', self::ALERT_STATUS); + } +} diff --git a/app/App/Collaborator/Components/MailedInvitations.php b/app/App/Collaborator/Components/MailedInvitations.php new file mode 100644 index 0000000..3e9384b --- /dev/null +++ b/app/App/Collaborator/Components/MailedInvitations.php @@ -0,0 +1,43 @@ + '$refresh']; + + public function cancel(string $invitationId): void + { + $invitation = Invitation::findOrFail($invitationId); + + /** @var User $user */ + $user = auth()->user(); + abort_unless($user->ownsToken($invitation->token), 403); + + $invitation->delete(); + + $this->emit('refreshCollaborators'); + + $this->toast(trans('tokens.invitations.mailed_invitation_removed_success'), 'success'); + } + + public function getInvitationsProperty(): Collection + { + return $this->token->invitations; + } +} diff --git a/app/App/Collaborator/Components/ManageCollaborators.php b/app/App/Collaborator/Components/ManageCollaborators.php new file mode 100644 index 0000000..8adedc1 --- /dev/null +++ b/app/App/Collaborator/Components/ManageCollaborators.php @@ -0,0 +1,31 @@ + '$refresh']; + + public function getCollaboratorsProperty(): Collection + { + return $this->token->collaborators()->where('user_id', '!=', Auth::id())->get(); + } + + public function getUserProperty(): User + { + return $this->token->collaborators()->where('user_id', Auth::id())->firstOrFail(); + } +} diff --git a/app/App/Collaborator/Components/UpdateCollaborator.php b/app/App/Collaborator/Components/UpdateCollaborator.php new file mode 100644 index 0000000..be9dde0 --- /dev/null +++ b/app/App/Collaborator/Components/UpdateCollaborator.php @@ -0,0 +1,70 @@ + 'edit']; + + public function edit(int $id): void + { + $collaborator = $this->token->collaborators()->findOrFail($id); + + $this->collaboratorId = $id; + $this->permissions = $collaborator->pivot->permissions ?? []; + } + + public function update(): void + { + $this->authorize('createCollaborator', $this->token); + + $this->validate([ + 'permissions' => ['required', 'array'], + 'permissions.*' => ['required', 'string', Rule::in($this->getAvailablePermissionsProperty()->toArray())], + ]); + + $this->token->collaborators()->updateExistingPivot( + $this->collaboratorId, + ['permissions' => $this->permissions] + ); + + $this->collaboratorId = null; + $this->permissions = []; + + $this->emit('refreshCollaborators'); + + $this->toast(trans('tokens.collaborators.permissions_updated_success'), 'success'); + } + + public function getAvailablePermissionsProperty(): Collection + { + return collect(Collaborator::availablePermissions()); + } + + public function close(): void + { + $this->collaboratorId = null; + $this->permissions = []; + } +} diff --git a/app/App/Collaborator/Mail/InviteExistingUser.php b/app/App/Collaborator/Mail/InviteExistingUser.php new file mode 100644 index 0000000..251c442 --- /dev/null +++ b/app/App/Collaborator/Mail/InviteExistingUser.php @@ -0,0 +1,51 @@ +fromInvitation($this->invitation, [ + 'content' => trans('notifications.subjects.new_invitation'), + ]) + ->withAction(trans('actions.view'), route('user.teams')) + ->success() + ->getContent(); + } + + public function toMail(): MailMessage + { + return (new MailMessage()) + ->subject($subject = trans('mails.subjects.new_invitation')) + ->view('mails.invite-existing-user', [ + 'subject' => $subject, + 'userName' => optional($this->invitation->user)->name ?? null, + 'tokenName' => $this->invitation->token->name, + 'url' => route('register', ['invitation' => $this->invitation->uuid]), + ]); + } +} diff --git a/app/App/Collaborator/Mail/InviteNewUser.php b/app/App/Collaborator/Mail/InviteNewUser.php new file mode 100644 index 0000000..d346da2 --- /dev/null +++ b/app/App/Collaborator/Mail/InviteNewUser.php @@ -0,0 +1,32 @@ +subject($subject = trans('mails.subjects.new_invitation')) + ->view('mails.invite-new-user', [ + 'subject' => $subject, + 'tokenName' => $this->invitation->token->name, + 'url' => route('register', ['invitation' => $this->invitation->uuid]), + ]); + } +} diff --git a/app/App/Collaborator/Notifications/CollaboratorAcceptedInvite.php b/app/App/Collaborator/Notifications/CollaboratorAcceptedInvite.php new file mode 100644 index 0000000..d49607a --- /dev/null +++ b/app/App/Collaborator/Notifications/CollaboratorAcceptedInvite.php @@ -0,0 +1,37 @@ +fromToken($this->token, [ + 'content' => trans('notifications.subjects.collaborator_accepted_invitation', ['collaborator' => $this->user->name]), + ]) + ->withAction(trans('actions.view'), route('user.teams')) + ->withUser($this->user) + ->success() + ->getContent(); + } +} diff --git a/app/App/Collaborator/Notifications/CollaboratorDeclinedInvite.php b/app/App/Collaborator/Notifications/CollaboratorDeclinedInvite.php new file mode 100644 index 0000000..574931c --- /dev/null +++ b/app/App/Collaborator/Notifications/CollaboratorDeclinedInvite.php @@ -0,0 +1,37 @@ +fromToken($this->token, [ + 'content' => trans('notifications.subjects.collaborator_refused_invitation', ['collaborator' => $this->user->name]), + ]) + ->withAction(trans('actions.view'), route('user.teams')) + ->withUser($this->user) + ->warning() + ->getContent(); + } +} diff --git a/app/App/Console/Commands/CheckRemoteServerExistence.php b/app/App/Console/Commands/CheckRemoteServerExistence.php new file mode 100644 index 0000000..7d7a908 --- /dev/null +++ b/app/App/Console/Commands/CheckRemoteServerExistence.php @@ -0,0 +1,25 @@ +serverProvider->client()->valid()) { + $this->notifiables($this->serverProvider)->each->notify(new ServerProviderAuthenticationFailed($this->serverProvider)); + + $this->serverProvider->delete(); + + ServerProviderDeleted::dispatch($this->serverProvider); + } + } + + /** + * @return Collection + */ + private function notifiables(ServerProvider $provider) : Collection + { + return collect([ + $provider->user(), + $provider->token->user, + ])->filter()->unique('id')->values(); + } +} diff --git a/app/App/Console/Commands/Jobs/PingServer.php b/app/App/Console/Commands/Jobs/PingServer.php new file mode 100644 index 0000000..56a9a18 --- /dev/null +++ b/app/App/Console/Commands/Jobs/PingServer.php @@ -0,0 +1,56 @@ +isReachable()) { + $this->server->token->collaborators->each->notify(new ServerUnreachable($this->server)); + + $this->server->markAsOffline(); + } + } + + private function isReachable(): bool + { + while ($this->failureCount <= 5) { + $process = new Process(['ping', '-c 3', '-i 5', $this->server->ip_address]); + $process->setTimeout(15); + + $response = ShellProcessRunner::run($process); + + if ($response->exitCode === 0) { + break; + } + + $this->failureCount++; + } + + return $this->failureCount < 3; + } +} diff --git a/app/App/Console/Commands/Jobs/RemoteServerExistence.php b/app/App/Console/Commands/Jobs/RemoteServerExistence.php new file mode 100644 index 0000000..e564a18 --- /dev/null +++ b/app/App/Console/Commands/Jobs/RemoteServerExistence.php @@ -0,0 +1,37 @@ +server->serverProvider->client()->server($this->server->provider_server_id); + } catch (ServerNotFound) { + $this->server->delete(); + } catch (Throwable) { + // ignore this? + } + } +} diff --git a/app/App/Console/Commands/Jobs/SyncServerRemoteAddress.php b/app/App/Console/Commands/Jobs/SyncServerRemoteAddress.php new file mode 100644 index 0000000..334f814 --- /dev/null +++ b/app/App/Console/Commands/Jobs/SyncServerRemoteAddress.php @@ -0,0 +1,42 @@ +server->ip_address === null) { + $response = $this->server->serverProvider->client()->server($this->server->provider_server_id); + + $this->server->update([ + 'ip_address' => $response->remoteAddress, + ]); + } + } + + public function backoff() : array + { + return [3, 5, 10]; + } +} diff --git a/app/App/Console/Commands/MaintainInvitations.php b/app/App/Console/Commands/MaintainInvitations.php new file mode 100644 index 0000000..79a1c13 --- /dev/null +++ b/app/App/Console/Commands/MaintainInvitations.php @@ -0,0 +1,24 @@ +filter->isExpired() as $invitation) { + $invitation->delete(); + } + }); + } +} diff --git a/app/App/Console/Commands/MaintainServerProviderKeys.php b/app/App/Console/Commands/MaintainServerProviderKeys.php new file mode 100644 index 0000000..08658d4 --- /dev/null +++ b/app/App/Console/Commands/MaintainServerProviderKeys.php @@ -0,0 +1,25 @@ +status, 'failed')) { + $server->token->user->notify(new ServerFailedDeployment($server)); + + $creator = $server->creator(); + + if ($creator && $creator->isNot($server->token->user)) { + $creator->notify(new ServerFailedDeployment($server)); + } + + $server->delete(); + } + }); + } +} diff --git a/app/App/Console/Commands/RunPlaybookCommand.php b/app/App/Console/Commands/RunPlaybookCommand.php new file mode 100644 index 0000000..0331a2f --- /dev/null +++ b/app/App/Console/Commands/RunPlaybookCommand.php @@ -0,0 +1,147 @@ +environment() !== 'local') { + $this->error('This command can only be run in the local environment!'); + } + + $playbookName = $this->argument('playbook'); + + if ($playbookName === null) { + $availablePlaybooks = $this->getAvailablePlaybooks(); + + $this->comment('Choose a playbook: '.PHP_EOL); + + foreach ($availablePlaybooks as $availablePlaybook) { + $this->comment("- {$availablePlaybook}"); + } + + $this->comment(''); + + $playbookName = $this->askPlaybookName($availablePlaybooks); + } + + $playbookDefinition = $this->resolvePlaybookDefinition($playbookName); + + $this->migrate(); + + $this->runPlaybook($playbookDefinition); + } + + private function migrate(): void + { + $this->info('Clearing the database'); + + $this->call('migrate:fresh', ['--force']); + } + + private function runPlaybook(PlaybookDefinition $definition): void + { + foreach ($definition->playbook->before() as $before) { + $this->runPlaybook( + $this->resolvePlaybookDefinition($before) + ); + } + + for ($i = 1; $i <= $definition->times; $i++) { + if ($definition->once && $this->definitionHasRun($definition)) { + break; + } + + $this->infoRunning($definition->playbook, $i); + + $definition->playbook->run($this->input, $this->output); + + $definition->playbook->hasRun(); + + $this->ranDefinitions[$definition->id] = ($this->ranDefinitions[$definition->id] ?? 0) + 1; + } + + foreach ($definition->playbook->after() as $after) { + $this->runPlaybook( + $this->resolvePlaybookDefinition($after) + ); + } + } + + private function askPlaybookName(array $availablePlaybooks): string + { + $helper = $this->getHelper('question'); + + $question = new Question(''); + + $question->setAutocompleterValues($availablePlaybooks); + + $playbookName = (string) $helper->ask($this->input, $this->output, $question); + + if ($playbookName === '') { + $this->error('Please choose a playbook'); + + return $this->askPlaybookName($availablePlaybooks); + } + + return $playbookName; + } + + private function getAvailablePlaybooks(): array + { + /** + * @var array + */ + $files = scandir(__DIR__.'/../Playbooks'); + + unset($files[0], $files[1]); + + return array_map(fn (string $file) => str_replace('.php', '', $file), $files); + } + + private function resolvePlaybookDefinition(mixed $class): PlaybookDefinition + { + if ($class instanceof PlaybookDefinition) { + return $class; + } + + if ($class instanceof Playbook) { + return new PlaybookDefinition(get_class($class)); + } + + $className = $class; + + if (! Str::startsWith($class, ['\\App\\Console\\Playbooks', 'App\\Console\\Playbooks'])) { + $className = "\\App\\Console\\Playbooks\\{$class}"; + } + + return new PlaybookDefinition($className); + } + + private function infoRunning(Playbook $playbook, int $i): void + { + $playbookName = get_class($playbook); + + $this->info("Running playbook `{$playbookName}` (#{$i})"); + } + + private function definitionHasRun(PlaybookDefinition $definition): bool + { + return array_key_exists($definition->id, $this->ranDefinitions); + } +} diff --git a/app/App/Console/Commands/SyncServerRemoteAddresses.php b/app/App/Console/Commands/SyncServerRemoteAddresses.php new file mode 100644 index 0000000..5a28baa --- /dev/null +++ b/app/App/Console/Commands/SyncServerRemoteAddresses.php @@ -0,0 +1,27 @@ +whereNotNull('provider_server_id') + ->chunkById(5000, function ($servers): void { + foreach ($servers as $server) { + SyncServerRemoteAddress::dispatch($server); + } + }); + } +} diff --git a/app/App/Console/Kernel.php b/app/App/Console/Kernel.php new file mode 100644 index 0000000..0e1b5ac --- /dev/null +++ b/app/App/Console/Kernel.php @@ -0,0 +1,112 @@ +command(SyncServerRemoteAddresses::class) + ->everyMinute() + ->withoutOverlapping(); + + $schedule + ->command(CheckRemoteServerExistence::class) + ->hourly() + ->withoutOverlapping(); + + $schedule + ->command(PingRemoteServers::class) + ->everyFifteenMinutes() + ->withoutOverlapping(); + + $schedule + ->command(MaintainServerProviderKeys::class) + ->hourly() + ->withoutOverlapping(); + + $schedule + ->command(MaintainInvitations::class) + ->everyTenMinutes() + ->withoutOverlapping(); + + $schedule + ->command(IndexServerProviderPlans::class) + ->daily() + ->withoutOverlapping(); + + $schedule + ->command(IndexServerProviderRegions::class) + ->twiceDaily() + ->withoutOverlapping(); + + $schedule + ->command(IndexServerProviderImages::class) + ->daily() + ->withoutOverlapping(); + + $schedule + ->command(PurgeServersWithFailedDeployments::class) + ->everyThirtyMinutes() + ->withoutOverlapping(); + + $schedule + ->command('telescope:prune') + ->environments(['local']) + ->twiceDaily(); + + $schedule + ->command('horizon:snapshot') + ->everyFiveMinutes(); + + $schedule->command('personal-data-export:clean')->daily(); + + // TODO: Do we want to use onFailure onSuccess hooks ? + + /* + $schedule + ->command('backup:clean') + ->daily() + ->at('01:00') + ->withoutOverlapping(); + + $schedule + ->command('backup:run') + ->daily() + ->at('01:10') + ->withoutOverlapping(); + */ + + // TODO: Command to upload the backup + } + + /** + * Register the commands for the application. + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/App/Console/Playbooks/BarePlaybook.php b/app/App/Console/Playbooks/BarePlaybook.php new file mode 100644 index 0000000..1b7bcd1 --- /dev/null +++ b/app/App/Console/Playbooks/BarePlaybook.php @@ -0,0 +1,24 @@ +writeln('[Playbook] Bare - success'); + } +} diff --git a/app/App/Console/Playbooks/CoinPlaybook.php b/app/App/Console/Playbooks/CoinPlaybook.php new file mode 100644 index 0000000..3071ba9 --- /dev/null +++ b/app/App/Console/Playbooks/CoinPlaybook.php @@ -0,0 +1,20 @@ +create([ + 'name' => 'ARK', + 'symbol' => 'ARK', + ]); + } +} diff --git a/app/App/Console/Playbooks/DatabaseNotificationPlaybook.php b/app/App/Console/Playbooks/DatabaseNotificationPlaybook.php new file mode 100644 index 0000000..f49827e --- /dev/null +++ b/app/App/Console/Playbooks/DatabaseNotificationPlaybook.php @@ -0,0 +1,17 @@ +count(5)->create(); + } +} diff --git a/app/App/Console/Playbooks/DemoPlaybook.php b/app/App/Console/Playbooks/DemoPlaybook.php new file mode 100644 index 0000000..7988c4d --- /dev/null +++ b/app/App/Console/Playbooks/DemoPlaybook.php @@ -0,0 +1,124 @@ +each(function ($user): void { + Invitation::factory()->count(10)->create(['user_id' => $user->id]); + + $key = SecureShellKey::factory()->create(['user_id' => $user->id]); + + Token::factory()->count(5)->create(['user_id' => $user->id])->each(function ($token) use ($key, $user) : void { + TokenCreated::dispatch($token); + + $token->slug = Str::slug($token->name); + + $token->setMetaAttribute('repoName', $token->slug); + $token->setMetaAttribute('onboarding.configuration_status', 'completed'); + $token->setMetaAttribute('onboarding.server_providers_status', 'completed'); + $token->setMetaAttribute('onboarding.server_config_status', 'completed'); + $token->setMetaAttribute('onboarding.secure_shell_keys_status', 'completed'); + $token->setMetaAttribute('onboarding.collaborators_status', 'completed'); + $token->setMetaAttribute('onboarding.servers_status', 'completed'); + + $token->setStatus(TokenStatusEnum::FINISHED); + + $token->secureShellKeys()->sync($key->id); + + $serverProvider = ServerProvider::factory()->digitalocean()->create([ + 'token_id' => $token->id, + ]); + + $serverProvider->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + ServerProviderCreated::dispatch($serverProvider); + + $serverProvider->plans()->syncWithoutDetaching(ServerProviderPlan::factory()->count(3)->create()); + $serverProvider->regions()->syncWithoutDetaching(ServerProviderRegion::factory()->count(3)->create()); + $serverProvider->images()->syncWithoutDetaching(ServerProviderImage::factory()->count(3)->create()); + + $token + ->networks() + ->each(function ($network) use ($token, $user) : void { + $server = $token->servers()->create([ + 'network_id' => $network->id, + 'server_provider_id' => $token->serverProviders()->first()->id, + 'server_provider_plan_id' => $token->serverProviders()->first()->plans()->first()->id, + 'server_provider_region_id' => $token->serverProviders()->first()->regions()->first()->id, + 'server_provider_image_id' => $token->serverProviders()->first()->images()->first()->id, + 'name' => Haiku::name(), + 'preset' => PresetTypeEnum::GENESIS, + ]); + + $server->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + $this->fakeServerCreatedEvent($server); + + $user->notify(new ServerDeployed($server)); + }); + }); + }); + } + + /** + * We should usually call a `ServerCreated::dispatch($server);` event, so + * the following listeners are called. However, since we are using a fake + * server, the `CreateServerOnProvider` listener had problems connecting to + * the server provider for provisioning so I am manually changing the server + * status and running the listeners. + * + * @param Server $server + * + * @return void + */ + private function fakeServerCreatedEvent($server): void + { + $event = new ServerCreated($server); + + (new ListenForActivityLogs())->handle($event); + + // Instead of (new CreateServerOnProvider())->handle($event); + $server->update([ + 'provider_server_id' => rand(5, 15), + 'ip_address' => '127.0.0.1', + 'provisioning_job_dispatched_at' => now(), + ]); + $server->setStatus('provisioning'); + $server->markAsOnline(); + } +} diff --git a/app/App/Console/Playbooks/DevelopmentPlaybook.php b/app/App/Console/Playbooks/DevelopmentPlaybook.php new file mode 100644 index 0000000..4346f5a --- /dev/null +++ b/app/App/Console/Playbooks/DevelopmentPlaybook.php @@ -0,0 +1,131 @@ +each(function ($user): void { + Invitation::factory()->count(10)->create(['user_id' => $user->id]); + + $key = SecureShellKey::factory()->create(['user_id' => $user->id]); + + Token::factory()->count(5)->create(['user_id' => $user->id])->each(function ($token) use ($key, $user) : void { + TokenCreated::dispatch($token); + + $token->slug = Str::slug($token->name); + + $token->setMetaAttribute('repoName', $token->slug); + $token->setMetaAttribute('onboarding.configuration_status', 'completed'); + $token->setMetaAttribute('onboarding.server_providers_status', 'completed'); + $token->setMetaAttribute('onboarding.server_config_status', 'completed'); + $token->setMetaAttribute('onboarding.secure_shell_keys_status', 'completed'); + $token->setMetaAttribute('onboarding.collaborators_status', 'completed'); + $token->setMetaAttribute('onboarding.servers_status', 'completed'); + + $token->setStatus(TokenStatusEnum::FINISHED); + + $token->secureShellKeys()->sync($key->id); + + $serverProvider = ServerProvider::factory()->digitalocean()->create([ + 'token_id' => $token->id, + ]); + + $serverProvider->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + ServerProviderCreated::dispatch($serverProvider); + + $serverProvider->plans()->syncWithoutDetaching(ServerProviderPlan::factory()->count(3)->create()); + $serverProvider->regions()->syncWithoutDetaching(ServerProviderRegion::factory()->count(3)->create()); + $serverProvider->images()->syncWithoutDetaching(ServerProviderImage::factory()->count(3)->create()); + + $token + ->networks() + ->each(function ($network) use ($token, $user) : void { + $server = $token->servers()->create([ + 'network_id' => $network->id, + 'server_provider_id' => $token->serverProviders()->first()->id, + 'server_provider_plan_id' => $token->serverProviders()->first()->plans()->first()->id, + 'server_provider_region_id' => $token->serverProviders()->first()->regions()->first()->id, + 'server_provider_image_id' => $token->serverProviders()->first()->images()->first()->id, + 'name' => Haiku::name(), + 'preset' => PresetTypeEnum::GENESIS, + ]); + + $server->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + $this->fakeServerCreatedEvent($server); + + $user->notify(new ServerDeployed($server)); + }); + }); + }); + } + + /** + * We should usually call a `ServerCreated::dispatch($server);` event, so + * the following listeners are called. However, since we are using a fake + * server, the `CreateServerOnProvider` listener had problems connecting to + * the server provider for provisioning so I am manually changing the server + * status and running the listeners. + * + * @param Server $server + * + * @return void + */ + private function fakeServerCreatedEvent($server): void + { + $event = new ServerCreated($server); + + (new ListenForActivityLogs())->handle($event); + + // Instead of (new CreateServerOnProvider())->handle($event); + $server->update([ + 'provider_server_id' => rand(5, 15), + 'ip_address' => '127.0.0.1', + 'provisioning_job_dispatched_at' => now(), + ]); + $server->setStatus('provisioning'); + $server->markAsOnline(); + } +} diff --git a/app/App/Console/Playbooks/InvitationPlaybook.php b/app/App/Console/Playbooks/InvitationPlaybook.php new file mode 100644 index 0000000..694c6ea --- /dev/null +++ b/app/App/Console/Playbooks/InvitationPlaybook.php @@ -0,0 +1,17 @@ +count(10)->create(); + } +} diff --git a/app/App/Console/Playbooks/NetworkPlaybook.php b/app/App/Console/Playbooks/NetworkPlaybook.php new file mode 100644 index 0000000..9925852 --- /dev/null +++ b/app/App/Console/Playbooks/NetworkPlaybook.php @@ -0,0 +1,17 @@ +count(10)->create(); + } +} diff --git a/app/App/Console/Playbooks/NotificationPlaybook.php b/app/App/Console/Playbooks/NotificationPlaybook.php new file mode 100644 index 0000000..1bbbd39 --- /dev/null +++ b/app/App/Console/Playbooks/NotificationPlaybook.php @@ -0,0 +1,101 @@ +create(['email' => 'notifications@ark.io']); + $collaborator = User::factory()->create(); + $token = Token::factory()->withDefaultNetworks()->create([ + 'user_id' => $user->id, + 'name' => 'MyNotificationChain', + ]); + $network = Network::factory()->ownedBy($token)->create(); + + $serverProvider = ServerProvider::factory()->digitalocean()->create([ + 'token_id' => $token->id, + ]); + + $serverProvider->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + $serverProvider->plans()->syncWithoutDetaching(ServerProviderPlan::factory()->count(3)->create()); + $serverProvider->regions()->syncWithoutDetaching(ServerProviderRegion::factory()->count(3)->create()); + $serverProvider->images()->syncWithoutDetaching(ServerProviderImage::factory()->count(3)->create()); + + $server = $token->servers()->create([ + 'network_id' => $network->id, + 'server_provider_id' => $token->serverProviders()->first()->id, + 'server_provider_plan_id' => $token->serverProviders()->first()->plans()->first()->id, + 'server_provider_region_id' => $token->serverProviders()->first()->regions()->first()->id, + 'server_provider_image_id' => $token->serverProviders()->first()->images()->first()->id, + 'name' => Haiku::name(), + 'preset' => PresetTypeEnum::GENESIS, + ]); + $server->setStatus('provisioning'); + $server->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + // Token + $user->notify(new TokenDeleted($token)); + + // Server + $user->notify(new ServerDeployed($server)); + $user->notify(new ServerDeleted($server)); + $user->notify(new ServerFailedDeployment($server)); + $user->notify(new ServerFailedToCreateOnProvider($serverProvider, $server->name)); + $user->notify(new ServerProvisioned($server)); + $user->notify(new ServerUnreachable($server)); + + // Server Provider + $user->notify(new IndexServerProviderImagesFailed($serverProvider)); + $user->notify(new IndexServerProviderPlansFailed($serverProvider)); + $user->notify(new IndexServerProviderRegionsFailed($serverProvider)); + + $user->notify(new ServerProviderAuthenticationFailed($serverProvider)); + $user->notify(new ServerProviderSecureShellKeyAdditionFailed($serverProvider)); + $user->notify(new ServerProviderSecureShellKeyLimitReached($serverProvider)); + $user->notify(new ServerProviderSecureShellKeyRemovalFailed($serverProvider)); + $user->notify(new ServerProviderSecureShellKeyUniqueness($serverProvider)); + $user->notify(new ServerProviderServerRemovalFailed($serverProvider)); + + // Collaborator + $user->notify(new CollaboratorAcceptedInvite($token, $collaborator)); + $user->notify(new CollaboratorDeclinedInvite($token, $collaborator)); + } +} diff --git a/app/App/Console/Playbooks/Playbook.php b/app/App/Console/Playbooks/Playbook.php new file mode 100644 index 0000000..db79a4e --- /dev/null +++ b/app/App/Console/Playbooks/Playbook.php @@ -0,0 +1,45 @@ +playbook = app($className); + $this->id = get_class($this->playbook); + } + + public static function times(string $className, int $times): self + { + $definition = new static($className); + + $definition->times = $times; + + return $definition; + } + + public static function once(string $className): self + { + $definition = new static($className); + + $definition->once = true; + + return $definition; + } +} diff --git a/app/App/Console/Playbooks/SecureShellKeyPlaybook.php b/app/App/Console/Playbooks/SecureShellKeyPlaybook.php new file mode 100644 index 0000000..78b6da5 --- /dev/null +++ b/app/App/Console/Playbooks/SecureShellKeyPlaybook.php @@ -0,0 +1,17 @@ +count(10)->create(); + } +} diff --git a/app/App/Console/Playbooks/ServerPlaybook.php b/app/App/Console/Playbooks/ServerPlaybook.php new file mode 100644 index 0000000..82a4782 --- /dev/null +++ b/app/App/Console/Playbooks/ServerPlaybook.php @@ -0,0 +1,48 @@ +count(10)->create()->each(function ($server): void { + $this->fakeServerCreatedEvent($server); + }); + } + + /** + * We should usually call a `ServerCreated::dispatch($server);` event, so + * the following listeners are called. However, since we are using a fake + * server, the `CreateServerOnProvider` listener had problems connecting to + * the server provider for provisioning so I am manually changing the server + * status and running the listeners. + * + * @param \Domain\Server\Models\Server $server + * + * @return void + */ + private function fakeServerCreatedEvent($server): void + { + $event = new ServerCreated($server); + + (new ListenForActivityLogs())->handle($event); + + // Instead of (new CreateServerOnProvider())->handle($event); + $server->update([ + 'provider_server_id' => rand(5, 15), + 'ip_address' => '127.0.0.1', + 'provisioning_job_dispatched_at' => now(), + ]); + $server->setStatus('provisioning'); + $server->markAsOnline(); + } +} diff --git a/app/App/Console/Playbooks/ServerProviderPlaybook.php b/app/App/Console/Playbooks/ServerProviderPlaybook.php new file mode 100644 index 0000000..794a21e --- /dev/null +++ b/app/App/Console/Playbooks/ServerProviderPlaybook.php @@ -0,0 +1,20 @@ +count(10)->create()->each(function ($serverProvider): void { + ServerProviderCreated::dispatch($serverProvider); + }); + } +} diff --git a/app/App/Console/Playbooks/TokenPlaybook.php b/app/App/Console/Playbooks/TokenPlaybook.php new file mode 100644 index 0000000..e86af28 --- /dev/null +++ b/app/App/Console/Playbooks/TokenPlaybook.php @@ -0,0 +1,23 @@ +count(10)->create()->each(function ($token): void { + TokenCreated::dispatch($token); + + $token->setStatus(TokenStatusEnum::FINISHED); + }); + } +} diff --git a/app/App/Console/Playbooks/UserPlaybook.php b/app/App/Console/Playbooks/UserPlaybook.php new file mode 100644 index 0000000..6b2a077 --- /dev/null +++ b/app/App/Console/Playbooks/UserPlaybook.php @@ -0,0 +1,17 @@ +create(['email' => 'hello@ark.io']); + } +} diff --git a/app/App/Contracts/LogsActivity.php b/app/App/Contracts/LogsActivity.php new file mode 100644 index 0000000..313c535 --- /dev/null +++ b/app/App/Contracts/LogsActivity.php @@ -0,0 +1,18 @@ + 'Amazon Web Services', + static::AZURE => 'Azure', + static::DIGITALOCEAN => 'DigitalOcean', + static::HETZNER => 'Hetzner', + static::LINODE => 'Linode', + static::VULTR => 'Vultr', + default => 'Other', + }; + } +} diff --git a/app/App/Exceptions/Handler.php b/app/App/Exceptions/Handler.php new file mode 100644 index 0000000..f696d05 --- /dev/null +++ b/app/App/Exceptions/Handler.php @@ -0,0 +1,59 @@ +> + */ + protected $dontReport = []; + + /** + * A list of the inputs that are never flashed for validation exceptions. + * + * @var array + */ + protected $dontFlash = [ + 'password', + 'password_confirmation', + ]; + + /** + * Report or log an exception. + * + * @param Throwable $exception + * @throws Throwable + */ + public function report(Throwable $exception) + { + if (app()->bound('sentry') && $this->shouldReport($exception)) { + app('sentry')->captureException($exception); + } + + parent::report($exception); + } + + /** + * Render an exception into an HTTP response. + * + * @param Request $request + * @param Throwable $exception + * + * @throws Throwable + * @return \Illuminate\Http\JsonResponse|Response|\Symfony\Component\HttpFoundation\Response + */ + public function render($request, Throwable $exception) + { + return parent::render($request, $exception); + } +} diff --git a/app/App/Http/Components/DownloadInstallScript.php b/app/App/Http/Components/DownloadInstallScript.php new file mode 100644 index 0000000..cf03aaa --- /dev/null +++ b/app/App/Http/Components/DownloadInstallScript.php @@ -0,0 +1,61 @@ +token->network($networkName); + + abort_if($network === null, 404); + + $path = $network->configurationPath(); + + if (! Storage::disk('token-config')->exists($path)) { + report(new RuntimeException('User tried to download an installation script for token [ID: '.$this->token->id.'] but the file does not exist.')); + + $this->toast(trans('pages.token.error_downloading_script'), 'error'); + + return null; + } + + return Storage::disk('token-config')->download( + $path, + $this->generateFilename($network) + ); + } + + public function availableNetworks() : Collection + { + return collect(NetworkTypeEnum::all())->filter(function ($networkName) { + $network = $this->token->network($networkName); + + return $network !== null && $network->hasProvisionedGenesis(); + })->values(); + } + + private function generateFilename(Network $network) : string + { + return sprintf('config-%s-%s.zip', Str::slug($this->token->name), $network->name); + } +} diff --git a/app/App/Http/Components/ManageWelcomeScreens.php b/app/App/Http/Components/ManageWelcomeScreens.php new file mode 100644 index 0000000..44350e4 --- /dev/null +++ b/app/App/Http/Components/ManageWelcomeScreens.php @@ -0,0 +1,44 @@ +visible = $this->user->seen_welcome_screens_at === null; + + $this->openModal(); + } + + public function close() : void + { + if ($this->hideForever) { + $this->user->touch('seen_welcome_screens_at'); + } + + $this->closeModal(); + } + + public function closeForever() : void + { + $this->user->touch('seen_welcome_screens_at'); + + $this->closeModal(); + } +} diff --git a/app/App/Http/Components/Modals/BetaNotice.php b/app/App/Http/Components/Modals/BetaNotice.php new file mode 100644 index 0000000..8bf154c --- /dev/null +++ b/app/App/Http/Components/Modals/BetaNotice.php @@ -0,0 +1,44 @@ +modalShown = ! Cookie::has('beta_agreement_at'); + } + + public function close(): void + { + if (! $this->agree) { + return; + } + + Cookie::queue('beta_agreement_at', Carbon::now(), Constants::COOKIE_EXPIRY_FOREVER); + + $this->closeModal(); + } +} diff --git a/app/App/Http/Components/UseDefaultsModal.php b/app/App/Http/Components/UseDefaultsModal.php new file mode 100644 index 0000000..5ecbcc2 --- /dev/null +++ b/app/App/Http/Components/UseDefaultsModal.php @@ -0,0 +1,48 @@ + 'showModal', + 'closeModal' => 'close', + ]; + + public function showModal(bool $isFee = false): void + { + $this->requiresConfirmation = true; + $this->isFee = $isFee; + } + + public function close(): void + { + $this->requiresConfirmation = false; + + $this->modalClosed(); + } + + public function emitDefaults(?bool $overwrite = false): void + { + if ($this->isFee === true) { + $this->emit('setFeeDefaults', $overwrite); + + return; + } + $this->emit('setDefaults', $overwrite); + } +} diff --git a/app/App/Http/Kernel.php b/app/App/Http/Kernel.php new file mode 100644 index 0000000..b5882d9 --- /dev/null +++ b/app/App/Http/Kernel.php @@ -0,0 +1,117 @@ + [ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + AuthenticateSession::class, + ShareErrorsFromSession::class, + VerifyCsrfToken::class, + SubstituteBindings::class, + // \Spatie\ResponseCache\Middlewares\CacheResponse::class, + ], + + 'api' => [ + 'throttle:60,1', + 'bindings', + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => Authenticate::class, + 'auth.basic' => AuthenticateWithBasicAuth::class, + 'bindings' => SubstituteBindings::class, + 'cache.headers' => SetCacheHeaders::class, + 'can' => Authorize::class, + 'guest' => RedirectIfAuthenticated::class, + 'signed' => ValidateSignature::class, + 'throttle' => ThrottleRequests::class, + 'throttleWithSessionToken' => ThrottleWithSessionToken::class, + 'verified' => EnsureEmailIsVerified::class, + 'cacheResponse' => CacheResponse::class, + 'doNotCacheResponse' => DoNotCacheResponse::class, + 'onboard' => RedirectIfOnboarding::class, + 'recaptcha' => VerifyRecaptcha::class, + ]; + + /** + * The priority-sorted list of middleware. + * + * This forces non-global middleware to always be in the given order. + * + * @var array + */ + protected $middlewarePriority = [ + StartSession::class, + ShareErrorsFromSession::class, + Authenticate::class, + ThrottleRequests::class, + AuthenticateSession::class, + SubstituteBindings::class, + Authorize::class, + ]; +} diff --git a/app/App/Listeners/FlushMediaCache.php b/app/App/Listeners/FlushMediaCache.php new file mode 100644 index 0000000..8837bbf --- /dev/null +++ b/app/App/Listeners/FlushMediaCache.php @@ -0,0 +1,24 @@ +media->model; + + if (method_exists($model, 'flushCache')) { + /* + * PHPStan give error: Cannot call method flushCache() on class-string|object. + * But flushCache() is never called if it wouldn't exist, so PHPStan is wrong in this case. + * @phpstan-ignore-next-line + */ + $model->flushCache(); + } + } +} diff --git a/app/App/Listeners/ListenForActivityLogs.php b/app/App/Listeners/ListenForActivityLogs.php new file mode 100644 index 0000000..158a54d --- /dev/null +++ b/app/App/Listeners/ListenForActivityLogs.php @@ -0,0 +1,30 @@ +subject(), + $event->description(), + $event->causer(), + $event->payload() + ); + } + + public function subscribe(Dispatcher $events) : void + { + $events->listen( + LogsActivity::class, + static::class.'@handle' + ); + } +} diff --git a/app/App/Providers/AppServiceProvider.php b/app/App/Providers/AppServiceProvider.php new file mode 100644 index 0000000..fd0da20 --- /dev/null +++ b/app/App/Providers/AppServiceProvider.php @@ -0,0 +1,100 @@ +app->isLocal()) { + $this->app->register(DuskServiceProvider::class); + } + } + + public function boot(): void + { + $this->app->bind(SecureShellKeyGenerator::class, fn () => new SecureShellKey()); + + $this->app->bind(ShellProcessRunnerContract::class, fn () => new ShellProcessRunner()); + + User::observe(UserObserver::class); + + $this->registerDataBags(); + + VerifyEmail::toMailUsing(function ($notifiable, $url) { + return (new MailMessage()) + ->subject($subject = trans('auth.verify.page_header')) + ->view('mails.email-verification', [ + 'url' => $url, + 'subject' => $subject, + ]); + }); + + ResetPassword::toMailUsing(function ($notifiable, $token) { + return (new MailMessage()) + ->subject($subject = trans('auth.passwords.email.page_header')) + ->view('mails.reset-password', [ + 'url' => route('password.reset', ['token' => $token, 'email' => $notifiable->email]), + 'subject' => $subject, + ]); + }); + } + + private function registerDataBags(): void + { + DataBag::register('fortify-content', [ + 'register' => [ + 'pageTitle' => trans('actions.sign_up'), + 'title' => trans('actions.sign_up'), + 'description' => trans('pages.auth.subtitle'), + ], + 'login' => [ + 'pageTitle' => trans('actions.login'), + 'title' => trans('actions.login'), + 'description' => trans('pages.auth.subtitle'), + ], + 'password' => [ + 'reset' => [ + 'pageTitle' => trans('actions.reset_password'), + 'title' => trans('auth.passwords.reset.title'), + 'description' => trans('auth.passwords.reset.description'), + ], + 'request' => [ + 'pageTitle' => trans('actions.reset_password'), + 'title' => trans('auth.passwords.reset.title'), + 'description' => trans('auth.passwords.reset.description'), + ], + ], + 'verification' => [ + 'notice' => [ + 'pageTitle' => trans('auth.verify.page_header'), + ], + 'verify' => [ + 'pageTitle' => trans('auth.verify.page_header'), + ], + 'send' => [ + 'pageTitle' => trans('auth.token.page_header'), + ], + ], + 'two-factor' => [ + 'login' => [ + 'pageTitle' => trans('auth.token.page_header'), + ], + ], + ]); + } +} diff --git a/app/App/Providers/AuthServiceProvider.php b/app/App/Providers/AuthServiceProvider.php new file mode 100644 index 0000000..ed2e7e9 --- /dev/null +++ b/app/App/Providers/AuthServiceProvider.php @@ -0,0 +1,30 @@ + SecureShellKeyPolicy::class, + Server::class => ServerPolicy::class, + ServerProvider::class => ServerProviderPolicy::class, + Token::class => TokenPolicy::class, + ]; + + public function boot(): void + { + $this->registerPolicies(); + } +} diff --git a/app/App/Providers/BroadcastServiceProvider.php b/app/App/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..0ff95a6 --- /dev/null +++ b/app/App/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ + [ + SendEmailVerificationNotification::class, + ], + MediaHasBeenAdded::class => [ + FlushMediaCache::class, + ], + + // Tokens + TokenCreated::class => [ + CreateDefaultNetworks::class, + ], + TokenDeleted::class => [ + PurgeTokenResources::class, + RemoveTokenNotifications::class, + NotifyCollaborators::class, + ], + + // Networks + NetworkCreated::class => [ + // + ], + + // Servers + ServerCreated::class => [ + CreateServerOnProvider::class, + ], + ServerDeleted::class => [ + NotifyUsersOfServerDeletion::class, + DestroyServerOnServerProvider::class, + ], + ServerUpdating::class => [ + UpdateServerProviderName::class, + ], + + // Server Providers + ServerProviderCreated::class => [ + // + ], + ServerProviderDeleted::class => [ + ForgetServerProviderTokenConfiguration::class, + TriggerSecureShellKeyRemovalFromServerProvider::class, + ], + ServerProviderUpdated::class => [ + IndexServerProviderRelatedData::class, + ], + ]; + + /** + * The subscriber classes to register. + * + * @var array + */ + protected $subscribe = [ + ListenForActivityLogs::class, + ]; +} diff --git a/app/App/Providers/HorizonServiceProvider.php b/app/App/Providers/HorizonServiceProvider.php new file mode 100644 index 0000000..0e4a8bc --- /dev/null +++ b/app/App/Providers/HorizonServiceProvider.php @@ -0,0 +1,26 @@ +configureRateLimiting(); + + // Because we register a Token model in a custom namespace, we'll register a Route binding to resolve the model when `{token}` is passed as a parameter... + // However, Laravel Fortify specifies `{token}` attribute for password reset routes, which is a direct collision with our implementation, + // so we to dynamically bind the value. + Route::bind('token', function ($value) { + // Password Reset Token is usually 64 chars... + if (strlen($value) >= 64) { + return $value; + } + + return (new Token())->resolveRouteBinding($value); + }); + + $this->routes(function (): void { + $this->mapApiRoutes(); + + $this->mapWebRoutes(); + }); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + */ + private function mapWebRoutes(): void + { + Route::middleware('web') + ->group(base_path('routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + */ + private function mapApiRoutes(): void + { + Route::prefix('api') + ->middleware('api') + ->group(base_path('routes/api.php')); + } + + /** + * Configure the rate limiters for the application. + * + * @return void + */ + private function configureRateLimiting(): void + { + RateLimiter::for('api', function (Request $request): Limit { + return Limit::perMinute(60); + }); + } +} diff --git a/app/App/Providers/ViewServiceProvider.php b/app/App/Providers/ViewServiceProvider.php new file mode 100644 index 0000000..73af744 --- /dev/null +++ b/app/App/Providers/ViewServiceProvider.php @@ -0,0 +1,42 @@ +with('currentUser', Auth::user()); + }); + + View::composer('hermes::navbar-notifications', function ($view): void { + $view->with('notificationCount', Auth::user()?->notifications()->count()); + }); + + View::composer('components.pending-invitations', function ($view): void { + $view->with('invitationsCount', Auth::user()?->invitations()->count()); + }); + } +} diff --git a/app/App/SecureShell/Components/CreateSecureShellKey.php b/app/App/SecureShell/Components/CreateSecureShellKey.php new file mode 100644 index 0000000..19c46f5 --- /dev/null +++ b/app/App/SecureShell/Components/CreateSecureShellKey.php @@ -0,0 +1,49 @@ +validate([ + 'name' => [ + 'required', + 'max:255', + Rule::unique('secure_shell_keys', 'name')->where('user_id', Auth::id()), + ], + 'public_key' => [ + 'required', + new SecureShellKey(), + Rule::unique('secure_shell_keys', 'public_key')->where('user_id', Auth::id()), + ], + ]); + + $this->user->secureShellKeys()->create($data); + + $this->toast(trans('pages.user-settings.create_ssh_success'), 'success'); + + $this->name = null; + $this->public_key = null; + + $this->emit('refreshSecureShellKeys'); + } +} diff --git a/app/App/SecureShell/Components/DeleteSecureShellKey.php b/app/App/SecureShell/Components/DeleteSecureShellKey.php new file mode 100644 index 0000000..cb9bf16 --- /dev/null +++ b/app/App/SecureShell/Components/DeleteSecureShellKey.php @@ -0,0 +1,51 @@ + 'askForConfirmation']; + + public function askForConfirmation(int $id): void + { + $this->keyId = $id; + } + + public function destroy(): void + { + $secureShellKey = $this->user->secureShellKeys()->findOrFail($this->keyId); + + $secureShellKey->delete(); + + $this->toast(trans('pages.user-settings.delete_ssh_success'), 'success'); + + $this->modalClosed(); + + $this->reset(); + + $this->emit('refreshSecureShellKeys'); + } + + public function cancel(): void + { + $this->keyId = null; + + $this->modalClosed(); + } +} diff --git a/app/App/SecureShell/Jobs/AddSecureShellKeyToServerProvider.php b/app/App/SecureShell/Jobs/AddSecureShellKeyToServerProvider.php new file mode 100644 index 0000000..f735afb --- /dev/null +++ b/app/App/SecureShell/Jobs/AddSecureShellKeyToServerProvider.php @@ -0,0 +1,81 @@ +serverProvider->token->keypair; + + $key = $this->serverProvider->client()->createSecureShellKey( + $this->serverProvider->token->slug.'-'.strtolower(Str::random(8)), + $keypair['publicKey'] + ); + + $this->serverProvider->update(['provider_key_id' => $key->id]); + + ServerProviderUpdated::dispatch($this->serverProvider); + } + + public function failed(Throwable $exception) : void + { + report($exception); + + if ($exception instanceof ServerProviderAuthenticationException) { + $this->notifiables()->each->notify(new ServerProviderAuthenticationFailed($this->serverProvider)); + } elseif ($exception instanceof ServerProviderSecureShellKeyUniqueness) { + $this->notifiables()->each->notify(new ServerProviderSecureShellKeyUniquenessNotification($this->serverProvider)); + } elseif ($exception instanceof ServerProviderSecureShellKeyLimitReached) { + $this->notifiables()->each->notify(new ServerProviderSecureShellKeyLimitReachedNotification($this->serverProvider)); + } else { + $this->notifiables()->each->notify(new ServerProviderSecureShellKeyAdditionFailed($this->serverProvider)); + } + } + + /** + * @return Collection + */ + private function notifiables() : Collection + { + return collect([ + $this->initiator, + $this->serverProvider->user(), + $this->serverProvider->token->user, + ])->filter()->unique('id')->values(); + } +} diff --git a/app/App/SecureShell/Jobs/RemoveSecureShellKeyFromServerProvider.php b/app/App/SecureShell/Jobs/RemoveSecureShellKeyFromServerProvider.php new file mode 100644 index 0000000..e4de9c7 --- /dev/null +++ b/app/App/SecureShell/Jobs/RemoveSecureShellKeyFromServerProvider.php @@ -0,0 +1,71 @@ +serverProvider = ServerProvider::withTrashed()->findOrFail($serverProvider->id); + } + + public function handle(): void + { + /** @var string $providerKeyId */ + $providerKeyId = $this->serverProvider->provider_key_id; + + $this->serverProvider->client()->deleteSecureShellKey( + $providerKeyId + ); + + $this->serverProvider->forceDelete(); + } + + public function failed(Throwable $exception): void + { + $this->serverProvider->forceDelete(); + + report($exception); + + $this->notifiables()->each->notify( + $exception instanceof ServerProviderAuthenticationException + ? new ServerProviderAuthenticationFailed($this->serverProvider) + : new ServerProviderSecureShellKeyRemovalFailed($this->serverProvider) + ); + } + + /** + * @return Collection + */ + private function notifiables() : Collection + { + return collect([ + $this->serverProvider->user(), + $this->serverProvider->token->user, + ])->filter()->unique('id')->values(); + } +} diff --git a/app/App/Server/Components/CreateServer.php b/app/App/Server/Components/CreateServer.php new file mode 100644 index 0000000..1464dc8 --- /dev/null +++ b/app/App/Server/Components/CreateServer.php @@ -0,0 +1,243 @@ + 'selectPreset', + 'setProvider' => 'selectProvider', + ]; + + public function mount(Network $network): void + { + $this->token = $network->token; + $this->network = $network; + $this->selectedProvider = $this->selectedProvider ?? $this->getUniqueProviders()->first(); + + if ($network->servers_count === 0) { + $this->preset = PresetTypeEnum::GENESIS; + } + } + + public function render(): View + { + if ($this->selectedProviderSelectedKey !== null) { + $this->selectedProvider = $this->token->serverProviders()->findOrFail($this->selectedProviderSelectedKey); + } + + $this->selectedProviderType = $this->selectedProvider->type; + + return view('livewire.create-server'); + } + + public function updated(string $field): void + { + $this->validateOnly($field, [ + 'delegatePassphrase' => ['nullable', new BIP39Passphrase()], + 'delegatePassword' => ['nullable', 'alpha_num', 'min:8'], + ]); + } + + public function updatedSelectedProviderSelectedKey(): void + { + $this->plan = null; + $this->region = null; + } + + public function selectPreset(string $preset): void + { + $this->preset = $preset; + } + + public function selectProvider(int $providerId): void + { + $this->plan = null; + $this->region = null; + $this->selectedProviderSelectedKey = null; + + $this->selectedProvider = $this->token->serverProviders()->findOrFail($providerId); + + if ($this->getHasMultipleKeysOnProviderProperty()) { + $this->selectedProviderSelectedKey = $this->selectedProvider->id; + } + } + + public function getHasMultipleKeysOnProviderProperty(): bool + { + return $this->token->serverProviders()->where('type', '=', $this->selectedProvider->type)->count() > 1; + } + + public function getProviderEntriesProperty(): Collection + { + return $this->token->serverProviders()->where('type', '=', $this->selectedProvider->type)->get(); + } + + public function getRegionsProperty(): Collection + { + return $this->selectedProvider->regions; + } + + public function getPlansProperty(): Collection + { + return $this->selectedProvider->plans; + } + + public function getFormattedPlansProperty(): Collection + { + $region = $this->selectedProvider->regions()->findOrFail($this->region); + + // Search by string... + $resultsByString = $this->selectedProvider->plans() + ->where('memory', '>=', config('deployer.deployment.minimumServerRam')) + ->when($this->preset === PresetTypeEnum::EXPLORER || $this->preset === PresetTypeEnum::GENESIS, fn ($query) => $query->where('cores', '>=', config('deployer.deployment.minimumCores'))) + ->whereJsonContains('regions', [$region->uuid]) + ->get(); + + if ($resultsByString->count() > 0) { + $plans = $resultsByString; + + return $plans; + } + + // Search by integer... + $resultsByNumber = $this->selectedProvider->plans() + ->where('memory', '>=', config('deployer.deployment.minimumServerRam')) + ->when($this->preset === PresetTypeEnum::EXPLORER || $this->preset === PresetTypeEnum::GENESIS, fn ($query) => $query->where('cores', '>=', config('deployer.deployment.minimumCores'))) + ->whereJsonContains('regions', [(int) $region->uuid]) + ->get(); + + if ($resultsByNumber->count() > 0) { + $plans = $resultsByNumber; + + return $plans; + } + + // Server Provider without regions... + $plans = $this->selectedProvider->plans() + ->where('memory', '>=', config('deployer.deployment.minimumServerRam')) + ->when($this->preset === PresetTypeEnum::EXPLORER || $this->preset === PresetTypeEnum::GENESIS, fn ($query) => $query->where('cores', '>=', config('deployer.deployment.minimumCores'))) + ->get(); + + return $plans; + } + + public function getPresetsProperty(): array + { + return [ + PresetTypeEnum::SEED, + PresetTypeEnum::RELAY, + PresetTypeEnum::FORGER, + PresetTypeEnum::EXPLORER, + ]; + } + + public function getUniqueProviders(): Collection + { + return $this->token->serverProviders->unique('type'); + } + + public function canSelect(): bool + { + if ($this->selectedProviderSelectedKey !== null && $this->getHasMultipleKeysOnProviderProperty()) { + return true; + } + + if (! $this->getHasMultipleKeysOnProviderProperty()) { + return true; + } + + return false; + } + + public function store(): void + { + $this->authorize('create', [Server::class, $this->token]); + + $this->validate([ + 'serverName' => ['required', 'min:3', 'max:50'], + 'preset' => ['required', Rule::in(['genesis', 'seed', 'relay', 'forger', 'explorer'])], + 'selectedProvider' => 'required', + 'region' => 'required', + 'plan' => 'required', + 'delegatePassphrase' => ['nullable', 'required_with:delegatePassword', new BIP39Passphrase()], + 'delegatePassword' => ['nullable', 'alpha_num', 'min:8'], + ]); + + /** @var ServerProviderImage $serverProviderImage */ + $serverProviderImage = $this->selectedProvider->images()->where('uuid', $this->selectedProvider->client()->getImageId())->first(); + + $server = $this->network->servers()->create([ + 'server_provider_id' => $this->selectedProvider->id, + 'name' => Format::withToken($this->serverName), + 'server_provider_region_id' => $this->selectedProvider->regions()->findOrFail($this->region)->id, + 'server_provider_plan_id' => $this->selectedProvider->plans()->findOrFail($this->plan)->id, + 'server_provider_image_id' => $serverProviderImage->id, + 'preset' => $this->preset, + 'delegate_passphrase' => $this->delegatePassphrase, + 'delegate_password' => $this->delegatePassword, + ]); + + /** @var User $user */ + $user = $this->user; + + $server->setMetaAttribute(ServerAttributeEnum::DISCLAIMER_MODAL_SEEN, false); + $server->setMetaAttribute(ServerAttributeEnum::SERVER_CREATED_MODAL_SEEN, false); + $server->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + ServerCreated::dispatch($server); + + $this->redirect($server->pathShow()); + } + + public function cancel(): void + { + $this->redirectRoute('tokens'); + } +} diff --git a/app/App/Server/Components/DeleteServer.php b/app/App/Server/Components/DeleteServer.php new file mode 100644 index 0000000..85d8ed9 --- /dev/null +++ b/app/App/Server/Components/DeleteServer.php @@ -0,0 +1,77 @@ + 'askForConfirmation', + 'setNetwork' => 'setNetwork', + 'setToken' => 'setToken', + ]; + + public function mount(Token $token, Network $network): void + { + $this->token = $token; + $this->network = $network; + } + + public function askForConfirmation(int $id): void + { + $this->serverId = $id; + } + + public function setToken(int $id): void + { + $this->token = Token::findOrFail($id); + $this->network = $this->token->networks()->where('name', NetworkTypeEnum::MAINNET)->firstOrFail(); + } + + public function setNetwork(int $id): void + { + $this->network = $this->token->networks()->where('id', $id)->firstOrFail(); + } + + public function destroy(): void + { + $server = $this->network->servers()->findOrFail($this->serverId); + + $this->authorize('delete', $server); + + $server->delete(); + + $this->serverId = null; + + $this->modalClosed(); + + $this->redirect(url()->previous()); + } + + public function cancel(): void + { + $this->serverId = null; + + $this->modalClosed(); + } +} diff --git a/app/App/Server/Components/DeleteServerProvider.php b/app/App/Server/Components/DeleteServerProvider.php new file mode 100644 index 0000000..4dc182b --- /dev/null +++ b/app/App/Server/Components/DeleteServerProvider.php @@ -0,0 +1,71 @@ + 'askForConfirmation']; + + public function askForConfirmation(int $id): void + { + $this->serverProviderId = $id; + + $this->openModal(); + } + + public function toggleDeleteOnProvider(): void + { + $this->deleteOnProvider = ! $this->deleteOnProvider; + } + + public function destroy() : void + { + $serverProvider = ServerProvider::findOrFail($this->serverProviderId); + + $this->authorize('delete', $serverProvider); + + if ($this->deleteOnProvider && $serverProvider->servers_count > 0) { + $serverProvider->servers()->get()->each->delete(); + } + + $serverProvider->delete(); + + ServerProviderDeleted::dispatch($serverProvider); + + $this->serverProviderId = null; + + $this->closeModal(); + + $this->toast(trans('tokens.server-providers.removed_success')); + $this->emit('refreshServerProviders'); + } + + public function cancel(): void + { + $this->serverProviderId = null; + + $this->closeModal(); + } +} diff --git a/app/App/Server/Components/ManageServerConfiguration.php b/app/App/Server/Components/ManageServerConfiguration.php new file mode 100644 index 0000000..a9b6b05 --- /dev/null +++ b/app/App/Server/Components/ManageServerConfiguration.php @@ -0,0 +1,213 @@ + 'selectProvider', + ]; + + public function mount(Token $token): void + { + $this->token = $token; + $this->selectedProvider = $this->selectedProvider ?? $this->getUniqueProviders()->first(); + + if ($this->token->hasServerProviders() && ! $token->needsServerConfiguration()) { + $serverConfig = $token->getMetaAttribute(ServerAttributeEnum::SERVER_CONFIG); + + $this->selectedProvider = ServerProvider::where('id', $serverConfig['server_provider_id'])->firstOrFail(); + $this->selectedProviderType = $this->selectedProvider->type; + $this->selectedProviderSelectedKey = $this->selectedProvider->id; + $this->serverName = $serverConfig['name']; + $this->region = $serverConfig['server_provider_region_id']; + $this->plan = $serverConfig['server_provider_plan_id']; + } + } + + public function render(): View + { + if ($this->selectedProviderSelectedKey !== null) { + $this->selectedProvider = $this->token->serverProviders()->findOrFail($this->selectedProviderSelectedKey); + } + + if ($this->selectedProvider !== null) { + $this->selectedProviderType = $this->selectedProvider->type; + } + + return view('livewire.manage-server-configuration', [ + 'selectProvider' => $this->selectedProvider, + 'selectedProviderSelectedKey' => $this->selectedProviderSelectedKey, + ]); + } + + public function updatedSelectedProviderSelectedKey(): void + { + $this->plan = null; + $this->region = null; + } + + public function getHasMultipleKeysOnProviderProperty(): bool + { + /** @var ServerProvider $selectedProvider */ + $selectedProvider = $this->selectedProvider; + + return $this->token->serverProviders()->where('type', '=', $selectedProvider->type)->count() > 1; + } + + public function getProviderEntriesProperty(): Collection + { + /** @var ServerProvider $selectedProvider */ + $selectedProvider = $this->selectedProvider; + + return $this->token->serverProviders()->where('type', '=', $selectedProvider->type)->get(); + } + + public function getRegionsProperty(): Collection + { + /** @var ServerProvider $selectedProvider */ + $selectedProvider = $this->selectedProvider; + + return $selectedProvider->regions; + } + + public function getPlansProperty(): Collection + { + /** @var ServerProvider $selectedProvider */ + $selectedProvider = $this->selectedProvider; + + return $selectedProvider->plans; + } + + public function getFormattedPlansProperty(): Collection + { + /** @var ServerProvider $selectedProvider */ + $selectedProvider = $this->selectedProvider; + + $region = $selectedProvider->regions()->findOrFail($this->region); + + // Search by string... + $resultsByString = $selectedProvider->plans() + ->where('memory', '>=', config('deployer.deployment.minimumServerRam')) + ->whereJsonContains('regions', [$region->uuid]) + ->get(); + + if ($resultsByString->count() > 0) { + $plans = $resultsByString; + + return $plans; + } + + // Search by integer... + $resultsByNumber = $selectedProvider->plans() + ->where('memory', '>=', config('deployer.deployment.minimumServerRam')) + ->whereJsonContains('regions', [(int) $region->uuid]) + ->get(); + + if ($resultsByNumber->count() > 0) { + $plans = $resultsByNumber; + + return $plans; + } + + // Server Provider without regions... + $plans = $selectedProvider->plans() + ->where('memory', '>=', config('deployer.deployment.minimumServerRam')) + ->get(); + + return $plans; + } + + public function selectProvider(int $providerId): void + { + $this->selectedProviderSelectedKey = null; + + $this->selectedProvider = $this->token->serverProviders()->findOrFail($providerId); + + $this->plan = null; + $this->region = null; + } + + public function getUniqueProviders(): Collection + { + return $this->token->serverProviders->unique('type'); + } + + public function canSelect(): bool + { + if ($this->getHasMultipleKeysOnProviderProperty() && $this->selectedProviderSelectedKey !== null) { + return true; + } + + if (! $this->getHasMultipleKeysOnProviderProperty() && $this->selectedProvider !== null) { + return true; + } + + return false; + } + + public function canSubmit(): bool + { + return $this->serverName !== null && + $this->serverName !== '' && + $this->selectedProvider !== null && + $this->region !== null && + $this->plan !== null; + } + + public function store(): void + { + $this->validate([ + 'serverName' => ['required', 'min:3', 'max:50'], + 'selectedProvider' => 'required', + 'selectedProviderSelectedKey' => Rule::requiredIf($this->getHasMultipleKeysOnProviderProperty()), + 'region' => 'required', + 'plan' => 'required', + ]); + + /** @var ServerProvider $selectedProvider */ + $selectedProvider = $this->selectedProvider; + + /** @var string $serverName */ + $serverName = $this->serverName; + + $this->token->setMetaAttribute(ServerAttributeEnum::SERVER_CONFIG, [ + 'server_provider_id' => $selectedProvider->id, + 'name' => $serverName, + 'server_provider_region_id' => $selectedProvider->regions()->findOrFail($this->region)->id, + 'server_provider_plan_id' => $selectedProvider->plans()->findOrFail($this->plan)->id, + ]); + + $this->redirectRoute('tokens.show', ['token' => $this->token]); + } + + public function cancel(): void + { + $this->redirectRoute('tokens.show', ['token' => $this->token]); + } +} diff --git a/app/App/Server/Components/ManageServerProviders.php b/app/App/Server/Components/ManageServerProviders.php new file mode 100644 index 0000000..8f00067 --- /dev/null +++ b/app/App/Server/Components/ManageServerProviders.php @@ -0,0 +1,138 @@ + 'selectProvider', + 'refreshServerProviders' => '$refresh', + ]; + + public function mount(Token $token): void + { + $this->token = $token; + $this->providers = $token->serverProviders; + $this->isSubmittingFirstProvider = false; + $this->provider = ServerProviderTypeEnum::DIGITALOCEAN; + } + + public function render(): View + { + return view('livewire.manage-server-providers', ['token' => $this->token, 'providers' => $this->providers, 'selectedProvider' => $this->provider]); + } + + public function selectProvider(string $provider): void + { + $this->provider = $provider; + } + + public function store(): void + { + $this->authorize('create', [ServerProvider::class, $this->token]); + + $this->validate([ + 'name' => ['required', 'max:255', Rule::unique('server_providers', 'name')->where('token_id', $this->token->id)], + 'access_token' => ['required', 'max:255', new UniqueTokenExtraAttribute($this->token)], + 'access_key' => ['required_if:type,===,aws', new UniqueTokenExtraAttribute($this->token)], + ]); + + if (! $this->token->onboarding()->completed(TokenOnboardingStatusEnum::SERVER_PROVIDERS)) { + $this->isSubmittingFirstProvider = true; + + $this->dispatchBrowserEvent('pending-first-provider', true); + } + + $serverProvider = new ServerProvider(); + $serverProvider->type = $this->provider; + $serverProvider->extra_attributes->set([ServerAttributeEnum::ACCESS_TOKEN => $this->access_token]); + + if ($serverProvider->client()->valid()) { + /** @var User $user */ + $user = $this->user; + + $serverProvider = $this->token->serverProviders()->create([ + 'name' => $this->name, + 'type' => $this->provider, + ]); + + $serverProvider->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + $serverProvider->setMetaAttribute(ServerAttributeEnum::ACCESS_TOKEN, $this->access_token); + $serverProvider->setMetaAttribute(ServerAttributeEnum::ACCESS_KEY, $this->access_key); + + if ($this->hasRegisteredProviderOfSameType($serverProvider->type)) { + $serverProvider->update(['provider_key_id' => $this->providers->where('type', '=', $serverProvider->type)->first()->provider_key_id]); + } else { + AddSecureShellKeyToServerProvider::dispatch($serverProvider, $user); + } + + IndexServerProviderPlans::dispatch($serverProvider); + IndexServerProviderRegions::dispatch($serverProvider); + IndexServerProviderImages::dispatch($serverProvider); + + $this->providers->push($serverProvider); + + ServerProviderCreated::dispatch($serverProvider); + + if (count($this->providers) === 1) { + alert('tokens.server-providers.added_success_redirect', FlashType::SUCCESS); + } else { + alert('tokens.server-providers.added_success', FlashType::SUCCESS); + } + } else { + if (! $this->token->hasServerProviders()) { + $this->isSubmittingFirstProvider = false; + + $this->dispatchBrowserEvent('pending-first-provider', false); + } + alert('tokens.server-providers.added_failed', FlashType::ERROR); + } + } + + private function hasRegisteredProviderOfSameType(string $type): bool + { + return $this->token->serverProviders()->where('type', $type)->count() > 1; + } +} diff --git a/app/App/Server/Components/RedirectOnServerProviderCompletion.php b/app/App/Server/Components/RedirectOnServerProviderCompletion.php new file mode 100644 index 0000000..38f6c99 --- /dev/null +++ b/app/App/Server/Components/RedirectOnServerProviderCompletion.php @@ -0,0 +1,29 @@ +token = $token; + } + + public function render(): View + { + if ($this->token->onboarding()->completed(TokenOnboardingStatusEnum::SERVER_PROVIDERS) && $this->token->serverProviders()->whereNull('provider_key_id')->count() === 0) { + redirect()->to(route('tokens.show', $this->token)); + } + + return view('livewire.redirect-on-server-provider-completion', ['token' => $this->token]); + } +} diff --git a/app/App/Server/Components/RenameServer.php b/app/App/Server/Components/RenameServer.php new file mode 100644 index 0000000..d65c33a --- /dev/null +++ b/app/App/Server/Components/RenameServer.php @@ -0,0 +1,137 @@ + 'renameServer', + ]; + + public function mount(Token $token, Network $network): void + { + $this->token = $token; + $this->network = $network; + } + + public function updated(string $propertyName): void + { + $this->validateOnly($propertyName, [ + 'name' => [ + 'required', + $this->getNameValidator(), + ], + ]); + } + + public function renameServer(int $id): void + { + $this->serverId = $id; + + /** @var Server $server */ + $server = $this->network->servers()->findOrFail($this->serverId); + + $this->server = $server; + $this->name = $this->server->name; + + $this->nameValidator = $this->server->serverProvider->client()::nameValidator(); + } + + public function rename(): void + { + $this->validate([ + 'name' => [ + 'required', + $this->getNameValidator(), + ], + ]); + + $server = $this->network->servers()->findOrFail($this->serverId); + + $this->authorize('rename', $server); + + try { + $server->update(['name' => $this->name]); + } catch (Throwable $e) { + $this->handleException($e, $server, fn ($message) => throw ValidationException::withMessages([ + 'name' => [$message], + ])); + } + + $this->serverId = null; + $this->server = null; + $this->name = null; + $this->nameValidator = ''; + + $this->closeModal(); + + $this->redirect(route('tokens', request()->query())); + } + + public function cancel(): void + { + $this->serverId = null; + $this->server = null; + $this->name = null; + $this->nameValidator = ''; + $this->resetErrorBag(); + + $this->closeModal(); + } + + private function getNameValidator(): Rule + { + return App::make($this->nameValidator); + } + + private function handleException(Throwable $exception, Server $server, Closure $fail) : void + { + if ($exception instanceof ServerNotFound) { + $fail(trans('notifications.server_not_found', ['server' => $server->getOriginal('name')])); + } elseif ($exception instanceof ServerProviderAuthenticationException) { + $fail(trans('notifications.server_provider_authentication_error', [ + 'provider' => ServerProviderTypeEnum::label($server->serverProvider->type), + 'name' => $server->serverProvider->name, + ])); + } else { + report($exception); + + $fail(trans('notifications.something_went_wrong')); + } + } +} diff --git a/app/App/Server/Components/ServerDeploymentTracker.php b/app/App/Server/Components/ServerDeploymentTracker.php new file mode 100644 index 0000000..078fc47 --- /dev/null +++ b/app/App/Server/Components/ServerDeploymentTracker.php @@ -0,0 +1,181 @@ +token = $token; + $this->serverId = $serverId; + $this->statuses = collect([]); + + // Might be weird to see the method called inline here, but it's called just to + // set up any additional state that might be set up if the server is missing... + $this->server(); + } + + public function render() : View + { + // Wraps into `optional()` so Blade template can chain calls that will not throw an exception if server is not found... + $server = optional($this->server()); + + return view('livewire.server-deployment-tracker', [ + 'server' => $server, + 'hasFinalState' => $server->isProvisioned() || $server->isFailed(), + 'userCanManageServer' => $this->userCanManageServer(), + ]); + } + + public function getGroupsProperty() : array + { + $server = $this->server(); + + if ($server === null || count($this->cachedGroups) > 0) { + return $this->cachedGroups; + } + + $this->cachedGroups = (new ServerDeploymentStatus())->getGroupStates()[$server->preset]; + + return $this->cachedGroups; + } + + public function getFirstState() : string + { + $server = $this->server(); + + if ($server === null) { + return head(head($this->cachedGroups)); + } + + $states = (new ServerDeploymentStatus())->getGroupStates()[$server->preset]; + + return head(head($states)); + } + + public function closeDisclaimerModal() : void + { + abort_unless($this->userCanManageServer(), 403); + + optional($this->server())->setMetaAttribute(ServerAttributeEnum::DISCLAIMER_MODAL_SEEN, true); + + $this->closeModal(); + } + + public function closeServerCreatedModal() : void + { + optional($this->server())->setMetaAttribute(ServerAttributeEnum::SERVER_CREATED_MODAL_SEEN, true); + + $this->closeModal(); + } + + public function getCredentials() : string + { + abort_unless($this->userCanManageServer(), 403); + + $usernameKey = trans('pages.server.installation.passwords_modal.username'); + $userPasswordKey = trans('pages.server.installation.passwords_modal.user_password'); + $sudoPasswordKey = trans('pages.server.installation.passwords_modal.sudo_password'); + + $server = $this->server(); + + if ($server === null) { + return ''; + } + + return + "{$usernameKey}: {$server->token->normalized_token}".'\n'. + "{$userPasswordKey}: {$server->user_password}".'\n'. + "{$sudoPasswordKey}: {$server->sudo_password}"; + } + + public function hasEverHadStatus(string $status) : bool + { + return $this->statuses->where('name', $status)->isNotEmpty(); + } + + private function userCanManageServer() : bool + { + /** @var User */ + $user = $this->user; + + $server = $this->server(); + + // If server is deleted, we "fake" that user has a permission to create servers just so Livewire doesn't show 403 modal... + // All credentials are still hidden from the user... + if ($server === null) { + return true; + } + + return $user->can('create', [ + Server::class, $server->token, + ]); + } + + private function server() : ?Server + { + if ($this->server !== null) { + return $this->server; + } + + /** @var Server|null $server */ + $server = $this->token->servers()->find($this->serverId); + + $this->server = $server; + + if ($this->server === null) { + $this->showDeploymentFailedModal = true; + $this->failureReason = trans('pages.server.installation.failed_modal.generic_error'); + + return null; + } + + if ($this->server->isFailed()) { + $this->showDeploymentFailedModal = true; + $this->failureReason = (string) $this->server->latestStatus(); + } + + $this->server->load('statuses'); + + $this->preset = $this->server->preset; + $this->currentStatus = $this->server->status(); + $this->statuses = $this->server->statuses; + + return $this->server; + } +} diff --git a/app/App/Server/Controllers/DeploymentStatusController.php b/app/App/Server/Controllers/DeploymentStatusController.php new file mode 100644 index 0000000..732d650 --- /dev/null +++ b/app/App/Server/Controllers/DeploymentStatusController.php @@ -0,0 +1,58 @@ +filled('version')) { + $status = $request->input('status'); + + $statuses = $this->getAllDeploymentStatuses(); + if (in_array($status, $statuses, true)) { + $server->setStatus($status); + } + + if (Str::startsWith($status, 'failed')) { + $this->handleFailedStatus($server, $status); + } + } else { + $server->fill([ + 'core_version' => $request->version, + ])->save(); + } + + // If any changes to any server happen we want to flush the token cache + // to ensure that checks like deployments of certain types run against + // fresh data to avoid data corruption or outdated UI feedback for users. + $server->token->flushCache(); + + return response()->noContent(); + } + + public function getAllDeploymentStatuses() : array + { + $serverDeploymentStatus = new ReflectionClass(new ServerDeploymentStatus()); + + return $serverDeploymentStatus->getConstants(); + } + + private function handleFailedStatus(Server $server, string $status): void + { + Log::warning('Missing case for failed deployment status: "'.$status.'"'); + + $server->setStatus('failed'); + } +} diff --git a/app/App/Server/Jobs/CreateServerOnProvider.php b/app/App/Server/Jobs/CreateServerOnProvider.php new file mode 100644 index 0000000..b63f47b --- /dev/null +++ b/app/App/Server/Jobs/CreateServerOnProvider.php @@ -0,0 +1,80 @@ +server->serverProvider->client()->create($this->server); + + $this->server->update([ + 'provider_server_id' => $remoteServer->id, + 'ip_address' => $remoteServer->remoteAddress, + ]); + + ServerProvisioner::dispatch($this->server); + + $this->notifiables( + notifyProviderOwner: false + )->each->notify(new ServerDeployed($this->server)); + } + + public function failed(Throwable $exception) : void + { + report($exception); + + // Server was actually created on the provider... + if ($this->server->provider_server_id !== null) { + $this->server->setStatus('failed'); + + return; + } + + $this->notifiables(notifyProviderOwner: true)->each->notify( + $exception instanceof ServerLimitExceeded + ? new RemoteServerLimitReached($this->server->serverProvider) + : new ServerFailedToCreateOnProvider($this->server->serverProvider, $this->server->name) + ); + + $this->server->delete(); + } + + /** + * @return Collection + */ + private function notifiables(bool $notifyProviderOwner) : Collection + { + return collect([ + $this->server->creator(), + $this->server->token->user, + $notifyProviderOwner ? $this->server->serverProvider->user() : null, + ])->filter()->unique('id')->values(); + } +} diff --git a/app/App/Server/Jobs/DestroyServerOnServerProvider.php b/app/App/Server/Jobs/DestroyServerOnServerProvider.php new file mode 100644 index 0000000..3c60050 --- /dev/null +++ b/app/App/Server/Jobs/DestroyServerOnServerProvider.php @@ -0,0 +1,55 @@ +serverProviderClient->delete($this->providerServerId); + } + + public function failed(Throwable $exception) : void + { + report($exception); + + $this->notifiables()->each->notify( + new ServerProviderServerRemovalFailed($this->server->serverProvider) + ); + } + + /** + * @return Collection + */ + private function notifiables() : Collection + { + return collect([ + $this->server->creator(), + $this->server->token->user, + $this->server->serverProvider->user(), + ])->filter()->unique('id')->values(); + } +} diff --git a/app/App/Server/Jobs/IndexServerProviderImages.php b/app/App/Server/Jobs/IndexServerProviderImages.php new file mode 100644 index 0000000..529a87d --- /dev/null +++ b/app/App/Server/Jobs/IndexServerProviderImages.php @@ -0,0 +1,57 @@ +serverProvider->client()->images()->items; + + DB::transaction(function () use ($images) { + $serverProviderImages = $images->map(fn ($image) => ServerProviderImage::updateOrCreate(['uuid' => $image->id], [ + 'uuid' => $image->id, + 'name' => $image->name, + ])); + + $this->serverProvider->images()->sync($serverProviderImages->pluck('id')->unique()); + }, 5); + } + + public function failed(): void + { + $this->serverProvider->token->user->notify(new IndexServerProviderImagesFailed($this->serverProvider)); + + $serverProviderOwner = $this->serverProvider->user(); + + if ($serverProviderOwner !== null && $serverProviderOwner->isNot($this->serverProvider->token->user) && $this->serverProvider->token->hasCollaborator($serverProviderOwner)) { + $serverProviderOwner->notify(new IndexServerProviderImagesFailed($this->serverProvider)); + } + } + + public function tags(): array + { + return ['images', 'serverProvider:'.$this->serverProvider->id]; + } +} diff --git a/app/App/Server/Jobs/IndexServerProviderPlans.php b/app/App/Server/Jobs/IndexServerProviderPlans.php new file mode 100644 index 0000000..0eea412 --- /dev/null +++ b/app/App/Server/Jobs/IndexServerProviderPlans.php @@ -0,0 +1,60 @@ +serverProvider->client()->plans()->items; + + DB::transaction(function () use ($plans) { + $serverProviderPlans = $plans->map(fn ($plan) => ServerProviderPlan::updateOrCreate(['uuid' => $plan->id], [ + 'uuid' => $plan->id, + 'disk' => $plan->disk, + 'memory' => $plan->memory, + 'cores' => $plan->cores, + 'regions' => $plan->regions, + ])); + + $this->serverProvider->plans()->sync($serverProviderPlans->pluck('id')->unique()); + }, 5); + } + + public function failed(): void + { + $this->serverProvider->token->user->notify(new IndexServerProviderPlansFailed($this->serverProvider)); + + $serverProviderOwner = $this->serverProvider->user(); + + if ($serverProviderOwner !== null && $serverProviderOwner->isNot($this->serverProvider->token->user) && $this->serverProvider->token->hasCollaborator($serverProviderOwner)) { + $serverProviderOwner->notify(new IndexServerProviderPlansFailed($this->serverProvider)); + } + } + + public function tags(): array + { + return ['plans', 'serverProvider:'.$this->serverProvider->id]; + } +} diff --git a/app/App/Server/Jobs/IndexServerProviderRegions.php b/app/App/Server/Jobs/IndexServerProviderRegions.php new file mode 100644 index 0000000..0b11cc0 --- /dev/null +++ b/app/App/Server/Jobs/IndexServerProviderRegions.php @@ -0,0 +1,57 @@ +serverProvider->client()->regions()->items; + + DB::transaction(function () use ($regions) { + $serverProviderRegions = $regions->map(fn ($region) => ServerProviderRegion::updateOrCreate(['uuid' => $region->id], [ + 'uuid' => $region->id, + 'name' => $region->name, + ])); + + $this->serverProvider->regions()->sync($serverProviderRegions->pluck('id')->unique()); + }, 5); + } + + public function failed(): void + { + $this->serverProvider->token->user->notify(new IndexServerProviderRegionsFailed($this->serverProvider)); + + $serverProviderOwner = $this->serverProvider->user(); + + if ($serverProviderOwner !== null && $serverProviderOwner->isNot($this->serverProvider->token->user) && $this->serverProvider->token->hasCollaborator($serverProviderOwner)) { + $serverProviderOwner->notify(new IndexServerProviderRegionsFailed($this->serverProvider)); + } + } + + public function tags(): array + { + return ['regions', 'serverProvider:'.$this->serverProvider->id]; + } +} diff --git a/app/App/Server/Jobs/ProvisionServer.php b/app/App/Server/Jobs/ProvisionServer.php new file mode 100644 index 0000000..283bf89 --- /dev/null +++ b/app/App/Server/Jobs/ProvisionServer.php @@ -0,0 +1,62 @@ + ProvisionExplorer::class, + 'forger' => ProvisionForger::class, + 'genesis' => ProvisionGenesis::class, + 'relay' => ProvisionRelay::class, + 'seed' => ProvisionSeed::class, + ]; + + public function __construct(public Server $server) + { + } + + public function handle(): void + { + /** @var ProvisionRelay $script */ + $script = new $this->presets[$this->server->preset]($this->server); + + $task = $this->server->addTask($script)->run(); + + if (! $task->isSuccessful()) { + throw new Exception($task->output); + } + + RemovePasswordsFromServer::dispatch($this->server); + + $this->server + ->token + ->collaborators + ->each + ->notify(new ServerProvisioned($this->server)); + } +} diff --git a/app/App/Server/Jobs/ProvisionUser.php b/app/App/Server/Jobs/ProvisionUser.php new file mode 100644 index 0000000..d45d661 --- /dev/null +++ b/app/App/Server/Jobs/ProvisionUser.php @@ -0,0 +1,44 @@ +server->addTask(new Script($this->server))->run(); + + if ($task->isSuccessful()) { + ProvisionServer::dispatch($this->server)->onQueue('long-running-queue'); + } else { + $this->release(10); + } + } + + public function failed(): void + { + $this->server->setStatus('failed'); + } +} diff --git a/app/App/Server/Jobs/RemovePasswordsFromServer.php b/app/App/Server/Jobs/RemovePasswordsFromServer.php new file mode 100644 index 0000000..8b6f805 --- /dev/null +++ b/app/App/Server/Jobs/RemovePasswordsFromServer.php @@ -0,0 +1,36 @@ +server->update([ + 'user_password' => null, + 'sudo_password' => null, + 'delegate_passphrase' => null, + 'delegate_password' => null, + 'provisioned_at' => now(), + ]); + } +} diff --git a/app/App/Server/Jobs/ServerProvisioner.php b/app/App/Server/Jobs/ServerProvisioner.php new file mode 100644 index 0000000..e0d0c09 --- /dev/null +++ b/app/App/Server/Jobs/ServerProvisioner.php @@ -0,0 +1,72 @@ +server->isProvisioned()) { + $this->delete(); + + return null; + } + + // Server has failed to provision within the 30 mins... + if ($this->server->olderThan(minutes: 30)) { + $this->failed(); + + return null; + } + + // Server is still provisioning... + if ($this->server->isProvisioning()) { + $this->release(10); + + return null; + } + + // Server is ready for provisioning when it has an IP address assigned to it... + if ($this->server->isReadyForProvisioning()) { + $this->server->touch('provisioning_job_dispatched_at'); + + return ProvisionUser::dispatch($this->server); + } + + $this->release(10); + + return null; + } + + public function retryUntil() : DateTime + { + return now()->addMinutes(35); + } + + public function failed() : void + { + $this->server->setStatus('failed'); + } +} diff --git a/app/App/Server/Jobs/WaitForServerToStart.php b/app/App/Server/Jobs/WaitForServerToStart.php new file mode 100644 index 0000000..addffc1 --- /dev/null +++ b/app/App/Server/Jobs/WaitForServerToStart.php @@ -0,0 +1,62 @@ +server->isOnline()) { + return; + } + + if ($this->reachable()) { + $this->server->markAsOnline(); + + return; + } + + $this->server->token->collaborators->each->notify(new ServerUnreachable($this->server)); + } + + public function reachable() : bool + { + while ($this->failureCount <= 5) { + $process = new Process(['ping', '-c 3', '-i 5', $this->server->ip_address]); + $process->setTimeout(15); + + $response = ShellProcessRunner::run($process); + + if ($response->exitCode === 0) { + break; + } + + $this->failureCount++; + } + + return $this->failureCount < 3; + } +} diff --git a/app/App/Server/Notifications/IndexServerProviderImagesFailed.php b/app/App/Server/Notifications/IndexServerProviderImagesFailed.php new file mode 100644 index 0000000..24c2e81 --- /dev/null +++ b/app/App/Server/Notifications/IndexServerProviderImagesFailed.php @@ -0,0 +1,38 @@ +token = $this->serverProvider->token; + } + + public function via(): array + { + return ['database']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServerProvider($this->serverProvider, [ + 'content' => trans('notifications.subjects.server_provider_image_index_failed', ['serverProvider' => $this->serverProvider->name]), + ]) + ->danger() + ->getContent(); + } +} diff --git a/app/App/Server/Notifications/IndexServerProviderPlansFailed.php b/app/App/Server/Notifications/IndexServerProviderPlansFailed.php new file mode 100644 index 0000000..3d83c60 --- /dev/null +++ b/app/App/Server/Notifications/IndexServerProviderPlansFailed.php @@ -0,0 +1,38 @@ +token = $this->serverProvider->token; + } + + public function via(): array + { + return ['database']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServerProvider($this->serverProvider, [ + 'content' => trans('notifications.subjects.server_provider_plan_index_failed', ['serverProvider' => $this->serverProvider->name]), + ]) + ->danger() + ->getContent(); + } +} diff --git a/app/App/Server/Notifications/IndexServerProviderRegionsFailed.php b/app/App/Server/Notifications/IndexServerProviderRegionsFailed.php new file mode 100644 index 0000000..1e5a89d --- /dev/null +++ b/app/App/Server/Notifications/IndexServerProviderRegionsFailed.php @@ -0,0 +1,38 @@ +token = $this->serverProvider->token; + } + + public function via(): array + { + return ['database']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServerProvider($this->serverProvider, [ + 'content' => trans('notifications.subjects.server_provider_region_index_failed', ['serverProvider' => $this->serverProvider->name]), + ]) + ->danger() + ->getContent(); + } +} diff --git a/app/App/Server/Notifications/RemoteServerLimitReached.php b/app/App/Server/Notifications/RemoteServerLimitReached.php new file mode 100644 index 0000000..7c2a17f --- /dev/null +++ b/app/App/Server/Notifications/RemoteServerLimitReached.php @@ -0,0 +1,44 @@ +token = $this->serverProvider->token; + } + + public function via(): array + { + return ['database']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServerProvider($this->serverProvider, [ + 'content' => trans('notifications.subjects.remote_server_limit_reached', ['serverProvider' => $this->serverProvider->name]), + ]) + ->danger() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerDeleted.php b/app/App/Server/Notifications/ServerDeleted.php new file mode 100644 index 0000000..656f63d --- /dev/null +++ b/app/App/Server/Notifications/ServerDeleted.php @@ -0,0 +1,47 @@ +token()->withTrashed()->first(); + + $this->token = $token; + } + + public function via(): array + { + return ['database']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServer($this->server, [ + 'content' => trans('notifications.subjects.server_deleted', ['server' => $this->server->name]), + ], $this->token) + ->success() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->token?->hasCollaborator($notifiable) ?? false; + } +} diff --git a/app/App/Server/Notifications/ServerDeployed.php b/app/App/Server/Notifications/ServerDeployed.php new file mode 100644 index 0000000..215337f --- /dev/null +++ b/app/App/Server/Notifications/ServerDeployed.php @@ -0,0 +1,39 @@ +token = $this->server->token; + } + + public function via(): array + { + return ['database']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServer($this->server, [ + 'content' => trans('notifications.subjects.server_deployed', ['server' => $this->server->name]), + ]) + ->withAction(trans('actions.view'), route('tokens.servers.show', [$this->token, $this->server->network, $this->server])) + ->success() + ->getContent(); + } +} diff --git a/app/App/Server/Notifications/ServerFailedDeployment.php b/app/App/Server/Notifications/ServerFailedDeployment.php new file mode 100644 index 0000000..a39ebfc --- /dev/null +++ b/app/App/Server/Notifications/ServerFailedDeployment.php @@ -0,0 +1,56 @@ +token = $this->server->token; + } + + public function via(): array + { + return ['database', 'mail']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServer($this->server, [ + 'content' => trans('notifications.subjects.server_failed_deployment', ['server' => $this->server->name]), + ]) + ->withAction(trans('actions.view'), route('tokens.servers.show', [$this->token, $this->server->network, $this->server])) + ->danger() + ->getContent(); + } + + public function toMail(): MailMessage + { + return (new MailMessage()) + ->subject($subject = strip_tags(trans('notifications.subjects.server_failed_deployment', ['server' => $this->server->name]))) + ->view('mails.server-failed-deployment', [ + 'subject' => $subject, + 'server' => $this->server, + ]); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->server->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerFailedToCreateOnProvider.php b/app/App/Server/Notifications/ServerFailedToCreateOnProvider.php new file mode 100644 index 0000000..d4d79e3 --- /dev/null +++ b/app/App/Server/Notifications/ServerFailedToCreateOnProvider.php @@ -0,0 +1,56 @@ +serverProvider = $serverProvider; + $this->token = $this->serverProvider->token; + $this->serverName = $serverName; + } + + public function via() : array + { + return ['database']; + } + + public function toArray() : array + { + return (new NotificationBuilder()) + ->fromServerProvider($this->serverProvider, [ + 'content' => trans('notifications.subjects.server_failed_to_create', ['server' => $this->serverName, 'provider' => $this->serverProviderLabel()]), + ]) + ->danger() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->token->hasCollaborator($notifiable); + } + + private function serverProviderLabel() : string + { + return ServerProviderTypeEnum::label($this->serverProvider->type); + } +} diff --git a/app/App/Server/Notifications/ServerProviderAuthenticationFailed.php b/app/App/Server/Notifications/ServerProviderAuthenticationFailed.php new file mode 100644 index 0000000..0509b77 --- /dev/null +++ b/app/App/Server/Notifications/ServerProviderAuthenticationFailed.php @@ -0,0 +1,47 @@ +token = $serverProvider->token; + } + + public function via(): array + { + return ['database']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServerProvider($this->serverProvider, [ + 'content' => trans( + 'notifications.subjects.server_provider_auth_failed', + ['serverProvider' => $this->serverProvider->name] + ), + ]) + ->warning() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerProviderSecureShellKeyAdditionFailed.php b/app/App/Server/Notifications/ServerProviderSecureShellKeyAdditionFailed.php new file mode 100644 index 0000000..523b00d --- /dev/null +++ b/app/App/Server/Notifications/ServerProviderSecureShellKeyAdditionFailed.php @@ -0,0 +1,43 @@ +fromServerProvider($this->serverProvider, [ + 'content' => trans( + 'notifications.subjects.server_provider_ssh_key_addition_failed', + ['serverProvider' => $this->serverProvider->name] + ), + ]) + ->danger() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->serverProvider->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerProviderSecureShellKeyLimitReached.php b/app/App/Server/Notifications/ServerProviderSecureShellKeyLimitReached.php new file mode 100644 index 0000000..c5bd53c --- /dev/null +++ b/app/App/Server/Notifications/ServerProviderSecureShellKeyLimitReached.php @@ -0,0 +1,43 @@ +fromServerProvider($this->serverProvider, [ + 'content' => trans( + 'notifications.subjects.server_provider_ssh_key_limit_reached', + ['serverProvider' => $this->serverProvider->name] + ), + ]) + ->danger() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->serverProvider->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerProviderSecureShellKeyRemovalFailed.php b/app/App/Server/Notifications/ServerProviderSecureShellKeyRemovalFailed.php new file mode 100644 index 0000000..c94904e --- /dev/null +++ b/app/App/Server/Notifications/ServerProviderSecureShellKeyRemovalFailed.php @@ -0,0 +1,43 @@ +fromServerProvider($this->serverProvider, [ + 'content' => trans( + 'notifications.subjects.server_provider_ssh_key_removal_failed', + ['serverProvider' => $this->serverProvider->name] + ), + ]) + ->danger() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->serverProvider->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerProviderSecureShellKeyUniqueness.php b/app/App/Server/Notifications/ServerProviderSecureShellKeyUniqueness.php new file mode 100644 index 0000000..94bf8db --- /dev/null +++ b/app/App/Server/Notifications/ServerProviderSecureShellKeyUniqueness.php @@ -0,0 +1,42 @@ +fromServerProvider($this->serverProvider, [ + 'content' => trans('notifications.subjects.server_provider_ssh_key_uniqueness_error', [ + 'serverProvider' => $this->serverProvider->name, + ]), + ]) + ->danger() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->serverProvider->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerProviderServerRemovalFailed.php b/app/App/Server/Notifications/ServerProviderServerRemovalFailed.php new file mode 100644 index 0000000..adbc81c --- /dev/null +++ b/app/App/Server/Notifications/ServerProviderServerRemovalFailed.php @@ -0,0 +1,43 @@ +fromServerProvider($this->serverProvider, [ + 'content' => trans( + 'notifications.subjects.server_provider_server_removal_failed', + ['serverProvider' => $this->serverProvider->name] + ), + ]) + ->danger() + ->getContent(); + } + + public function shouldSend(User $notifiable) : bool + { + return $this->serverProvider->token->hasCollaborator($notifiable); + } +} diff --git a/app/App/Server/Notifications/ServerProvisioned.php b/app/App/Server/Notifications/ServerProvisioned.php new file mode 100644 index 0000000..d232c45 --- /dev/null +++ b/app/App/Server/Notifications/ServerProvisioned.php @@ -0,0 +1,60 @@ +token = $server->token; + } + + public function via(): array + { + return ['database', 'mail']; + } + + public function toArray(): array + { + return (new NotificationBuilder()) + ->fromServer($this->server, [ + 'content' => trans('notifications.subjects.server_provisioned', ['server' => $this->server->name]), + ]) + ->withAction(trans('actions.view'), $this->server->pathShow()) + ->success() + ->getContent(); + } + + public function toMail(User $notifiable): MailMessage + { + $userCanCreateServers = $notifiable->can('create', [ + Server::class, $this->token, + ]); + + return (new MailMessage()) + ->subject($subject = strip_tags(trans('notifications.subjects.server_provisioned', ['server' => $this->server->name]))) + ->view('mails.server-provisioned', [ + 'subject' => $subject, + 'token' => $this->token, + 'server' => $this->server, + 'username' => $this->token->normalized_token, + 'userPassword' => $userCanCreateServers ? $this->server->user_password : null, + 'sudoPassword' => $userCanCreateServers ? $this->server->sudo_password : null, + 'userCanCreateServers' => $userCanCreateServers, + ]); + } +} diff --git a/app/App/Server/Notifications/ServerUnreachable.php b/app/App/Server/Notifications/ServerUnreachable.php new file mode 100644 index 0000000..eea3a96 --- /dev/null +++ b/app/App/Server/Notifications/ServerUnreachable.php @@ -0,0 +1,37 @@ +fromServer($this->server, [ + 'content' => trans( + 'notifications.subjects.server_unreachable', + ['server' => $this->server->name] + ), + ]) + ->warning() + ->getContent(); + } +} diff --git a/app/App/Server/Requests/StoreServerProviderRequest.php b/app/App/Server/Requests/StoreServerProviderRequest.php new file mode 100644 index 0000000..d6d7c11 --- /dev/null +++ b/app/App/Server/Requests/StoreServerProviderRequest.php @@ -0,0 +1,25 @@ +check(); + } + + public function rules(): array + { + return [ + 'type' => ['required', 'max:255'], + 'name' => ['required', 'max:255'], + 'access_token' => ['required', 'max:255'], + 'access_key' => 'required_if:type,===,aws', + ]; + } +} diff --git a/app/App/Server/Resources/PlanResource.php b/app/App/Server/Resources/PlanResource.php new file mode 100644 index 0000000..0b34992 --- /dev/null +++ b/app/App/Server/Resources/PlanResource.php @@ -0,0 +1,26 @@ + $this->disk.'GB / '.$this->memory.'MB / '.$this->cores.' Cores', + 'value' => $this->id, + 'memory' => $this->memory, + 'regions' => $this->regions, + ]; + } +} diff --git a/app/App/Server/Resources/RegionResource.php b/app/App/Server/Resources/RegionResource.php new file mode 100644 index 0000000..1ff1ef1 --- /dev/null +++ b/app/App/Server/Resources/RegionResource.php @@ -0,0 +1,24 @@ + $this->name, + 'value' => $this->id, + ]; + } +} diff --git a/app/App/Token/Components/ActiveServers.php b/app/App/Token/Components/ActiveServers.php new file mode 100644 index 0000000..1eab55e --- /dev/null +++ b/app/App/Token/Components/ActiveServers.php @@ -0,0 +1,210 @@ + 'setToken', + 'selectNetwork' => 'selectNetwork', + 'sortingUpdated' => 'sortingUpdated', + ]; + + /** @var mixed */ + protected $queryString = [ + 'network' => ['except' => ''], + ]; + + public function getActiveNetwork(): ?Network + { + $validNetworks = [ + NetworkTypeEnum::MAINNET, + NetworkTypeEnum::DEVNET, + NetworkTypeEnum::TESTNET, + ]; + + if ($this->network !== null && in_array($this->network, $validNetworks, true)) { + return $this->selectedToken->network($this->network); + } + + return $this->selectedToken->network(NetworkTypeEnum::MAINNET); + } + + public function mount(): void + { + $this->setNetwork($this->getActiveNetwork()); + } + + public function render(): View + { + return view('livewire.active-servers', [ + 'selectedToken' => $this->selectedToken, + 'selectedNetwork' => $this->selectedNetwork, + 'selectedNetworkServers' => $this->selectedNetworkServers, + 'filteredNetworkServers' => $this->filteredNetworkServers, + ]); + } + + public function setToken(int $id): void + { + $this->selectedToken = Token::findOrFail($id); + + $this->setNetwork($this->getActiveNetwork()); + } + + public function selectNetwork(int $id): void + { + $network = $this->selectedToken->networks()->findOrFail($id); + + $this->setNetwork($network); + + $this->network = $this->selectedNetwork->name; + + $this->emit('setNetwork', $this->selectedNetwork->id); + } + + public function sortingUpdated(): void + { + if ($this->sortDirection === 'asc') { + /* @phpstan-ignore-next-line */ + $this->selectedNetworkServers = $this->selectedNetworkServers->sortBy($this->sortBy); + } elseif ($this->sortDirection === 'desc') { + $this->selectedNetworkServers = $this->selectedNetworkServers + ->sortByDesc($this->sortBy ?? ''); + } else { + $this->selectedNetworkServers = $this->selectedNetworkServers + ->sortByDesc('created_at'); + } + } + + public function startServer(int $id): void + { + $server = $this->selectedNetwork->servers()->findOrFail($id); + + $this->authorize('start', $server); + + try { + $server->serverProvider->client()->start($server->provider_server_id); + + $server->markAsOnline(); + + $this->toast(trans('notifications.server_started', ['server' => $server->name])); + } catch (Exception $exception) { + $this->handleException($exception, $server->name, $server->serverProvider); + } + } + + public function stopServer(int $id): void + { + $server = $this->selectedNetwork->servers()->findOrFail($id); + + $this->authorize('stop', $server); + + try { + $server->serverProvider->client()->stop($server->provider_server_id); + + $server->markAsOffline(); + + $this->toast(trans('notifications.server_stopped', ['server' => $server->name])); + } catch (Exception $exception) { + $this->handleException($exception, $server->name, $server->serverProvider); + } + } + + public function rebootServer(int $id): void + { + $server = $this->selectedNetwork->servers()->findOrFail($id); + + $this->authorize('restart', $server); + + try { + $server->serverProvider->client()->reboot($server->provider_server_id); + + WaitForServerToStart::dispatch($server)->delay( + now()->addSeconds(30) + ); + + $server->markAsOffline(); + + $this->toast(trans('notifications.server_rebooted', ['server' => $server->name])); + } catch (Exception $exception) { + $this->handleException($exception, $server->name, $server->serverProvider); + } + } + + public function updatedServerType(): void + { + $this->filteredNetworkServers = $this->selectedNetworkServers->where('preset', $this->serverType); + } + + private function setNetwork(?Network $network): void + { + if ($network !== null) { + $this->selectedNetwork = $network; + $this->selectedNetworkServers = $network->servers()->latest()->get(); + $this->serverType = 'all'; + $this->filteredNetworkServers = $this->selectedNetworkServers; + } + } + + private function handleException(Exception $exception, string $name, ServerProvider $provider): void + { + if ($exception instanceof ServerNotFound) { + alert('notifications.server_not_found', FlashType::ERROR, ['server' => $name]); + } elseif ($exception instanceof ServerProviderError && $exception->getMessage() !== '') { + alert($exception->getMessage(), FlashType::ERROR); + } elseif ($exception instanceof ServerProviderAuthenticationException) { + alert(trans('notifications.server_provider_authentication_error', [ + 'provider' => ServerProviderTypeEnum::label($provider->type), + 'name' => $provider->name, + ]), FlashType::ERROR); + } else { + report($exception); + + alert('notifications.something_went_wrong', FlashType::ERROR); + } + } +} diff --git a/app/App/Token/Components/CreateTokenModal.php b/app/App/Token/Components/CreateTokenModal.php new file mode 100644 index 0000000..5e24145 --- /dev/null +++ b/app/App/Token/Components/CreateTokenModal.php @@ -0,0 +1,70 @@ + 'handle', + ]; + + public function handle(): RedirectResponse|Redirector|null + { + abort_if($this->user === null, 403); + + $this->token = $this->user->ownedTokens()->currentStatus(TokenStatusEnum::PENDING)->first(); + + if ($this->token === null) { + return $this->continue(); + } + + return null; + } + + public function continue(): RedirectResponse|Redirector + { + return redirect()->route('tokens.create'); + } + + public function cancel(): void + { + $this->token = null; + + $this->closeModal(); + } + + public function deletePendingToken(): RedirectResponse|Redirector + { + /** @var Token $token */ + $token = $this->token; + + $token->forceDelete(); + + TokenDeleted::dispatch($token); + + return $this->continue(); + } +} diff --git a/app/App/Token/Components/DeleteToken.php b/app/App/Token/Components/DeleteToken.php new file mode 100644 index 0000000..ac423f0 --- /dev/null +++ b/app/App/Token/Components/DeleteToken.php @@ -0,0 +1,123 @@ + 'askForConfirmation', + 'setOption' => 'selectOption', + ]; + + public function mount(): void + { + $this->options = [ + 'blockchain' => trans('tokens.delete_token_modal.option_blockchain'), + 'servers' => trans('tokens.delete_token_modal.option_servers'), + ]; + + $this->selectedOptions = ['blockchain']; + } + + public function getSelectedOptionsProperty(): array + { + return $this->selectedOptions; + } + + public function selectOption(string $option): void + { + if (! in_array($option, $this->selectedOptions, true)) { + array_push($this->selectedOptions, $option); + } else { + $this->selectedOptions = array_diff($this->selectedOptions, [$option]); + } + } + + public function askForConfirmation(int $id): void + { + $this->openModal(); + + $this->tokenId = $id; + $this->token = Token::findOrFail($id); + } + + public function destroy(): void + { + $this->authorize('delete', $this->token); + + foreach ($this->selectedOptions as $action) { + if ($action === 'servers') { + $this->destroyWithServers(); + } + } + + $this->destroyToken(); + + $this->modalClosed(); + + $this->redirectRoute('tokens'); + } + + public function cancel(): void + { + $this->tokenId = null; + + $this->modalClosed(); + } + + public function shouldBeDisabled(string $key): bool + { + if ($key === 'blockchain') { + return false; + } + + if ($key === 'servers') { + return $this->token->servers->count() === 0; + } + + return false; + } + + public function hasConfirmedName(): bool + { + return $this->token_name === $this->token->name; + } + + private function destroyToken(): void + { + $this->token->delete(); + + TokenDeleted::dispatch($this->token, $shouldDeleteServers = false); + } + + private function destroyWithServers(): void + { + foreach ($this->token->servers as $server) { + $server->delete(); + } + } +} diff --git a/app/App/Token/Components/DeployBlockchain.php b/app/App/Token/Components/DeployBlockchain.php new file mode 100644 index 0000000..4b4481c --- /dev/null +++ b/app/App/Token/Components/DeployBlockchain.php @@ -0,0 +1,103 @@ + 'askForConfirmation', + 'setNetworkOption' => 'selectOption', + ]; + + public function mount(): void + { + $this->options = [ + NetworkTypeEnum::MAINNET => trans('tokens.deploy_blockchain_modal.option_mainnet'), + NetworkTypeEnum::DEVNET => trans('tokens.deploy_blockchain_modal.option_devnet'), + NetworkTypeEnum::TESTNET => trans('tokens.deploy_blockchain_modal.option_testnet'), + ]; + + $this->selectedOption = NetworkTypeEnum::MAINNET; + } + + public function selectOption(string $option): void + { + $this->selectedOption = $option; + } + + public function askForConfirmation(int $id): void + { + $this->openModal(); + + $this->tokenId = $id; + $this->token = Token::findOrFail($id); + } + + public function deploy(): void + { + $serverConfig = $this->token->getMetaAttribute(TokenAttributeEnum::SERVER_CONFIG); + $serverProvider = $this->token->serverProviders()->findOrFail($serverConfig['server_provider_id']); + $network = $this->token->networks()->where('name', $this->selectedOption)->firstOrFail(); + + /** @var ServerProviderImage $ServerProviderImage */ + $ServerProviderImage = $serverProvider->images()->where('uuid', $serverProvider->client()->getImageId())->first(); + + $server = $network->servers()->create([ + 'server_provider_id' => $serverConfig['server_provider_id'], + 'name' => Format::withToken($serverConfig['name']), + 'server_provider_region_id' => $serverConfig['server_provider_region_id'], + 'server_provider_plan_id' => $serverConfig['server_provider_plan_id'], + 'server_provider_image_id' => $ServerProviderImage->id, + 'preset' => PresetTypeEnum::GENESIS, + ]); + + /** @var User $user */ + $user = $this->user; + + $server->setMetaAttribute(ServerAttributeEnum::DISCLAIMER_MODAL_SEEN, false); + $server->setMetaAttribute(ServerAttributeEnum::SERVER_CREATED_MODAL_SEEN, false); + $server->setMetaAttribute(ServerAttributeEnum::CREATOR, $user->id); + + ServerCreated::dispatch($server); + + $this->token->forgetServerConfiguration(); + + $this->redirectRoute('tokens.servers.show', [$this->token, $network, $server]); + } + + public function cancel(): void + { + $this->tokenId = null; + + $this->modalClosed(); + } +} diff --git a/app/App/Token/Components/LogoUpload.php b/app/App/Token/Components/LogoUpload.php new file mode 100644 index 0000000..31dc05f --- /dev/null +++ b/app/App/Token/Components/LogoUpload.php @@ -0,0 +1,93 @@ +token = $token; + $this->logo = $this->token->getFirstMedia('logo') !== null ? $this->token->getFirstMedia('logo')->getUrl() : null; + $this->imageDeleted = false; + } + + public function updatedImageSingle(): void + { + $this->authorize('update', $this->token); + + if (! $this->imageSingle instanceof TemporaryUploadedFile) { + $this->imageSingle = TemporaryUploadedFile::createFromLivewire($this->imageSingle); + } + + $this->validateImageSingle(); + + $this->setTokenImage(); + } + + public function setTokenImage(): void + { + /** @var TemporaryUploadedFile $imageSingle */ + $imageSingle = $this->imageSingle; + + $this->token + ->addMedia($imageSingle->getRealPath()) + ->withResponsiveImages() + ->usingName($imageSingle->hashName()) + ->toMediaCollection('logo'); + + $this->token->refresh(); + $this->logo = $this->token->logo; + $this->imageDeleted = false; + } + + public function deleteImageSingle(): void + { + /** @var Media $media */ + $media = $this->token->getFirstMedia('logo'); + + $media->delete(); + $this->token->refresh(); + + if ($this->imageSingle instanceof TemporaryUploadedFile) { + $this->imageSingle->delete(); + } + + $this->imageSingle = null; + $this->logo = null; + $this->imageDeleted = true; + } +} diff --git a/app/App/Token/Components/ManageTokenSecureShellKeys.php b/app/App/Token/Components/ManageTokenSecureShellKeys.php new file mode 100644 index 0000000..422b790 --- /dev/null +++ b/app/App/Token/Components/ManageTokenSecureShellKeys.php @@ -0,0 +1,144 @@ + 'selectOption', + 'handleSelect' => 'handleSelect', + 'refreshSecureShellKeys' => '$refresh', + ]; + + public function mount(Token $token): void + { + $this->token = $token; + $this->selectedOptions = array_merge($this->selectedOptions, $this->getTokenKeys()); + } + + public function getKeysProperty(): Collection + { + return $this->token->availableKeys(); + } + + public function getCanSubmitProperty(): bool + { + return (count(array_diff($this->selectedOptions, $this->getTokenKeys())) > 0 + || count(array_diff($this->getTokenKeys(), $this->selectedOptions)) > 0) + && count($this->selectedOptions) > 0; + } + + public function getTokenKeys(): array + { + return $this->token->secureShellKeys->pluck('id')->toArray(); + } + + public function isRegistered(int $option): bool + { + return in_array($option, $this->selectedOptions, true); + } + + public function selectOption(int $option): void + { + $this->authorize('manageKeys', $this->token); + + if (! in_array($option, array_values($this->selectedOptions), true)) { + $this->selectedOptions[] = $option; + } else { + $this->selectedOptions = array_diff($this->selectedOptions, [$option]); + } + } + + public function selectAll(): void + { + $this->authorize('manageKeys', $this->token); + + $this->selectedOptions = Arr::flatten($this->getKeysProperty()->pluck('id')); + } + + public function deselectAll(): void + { + $this->authorize('manageKeys', $this->token); + + $this->selectedOptions = []; + } + + public function store(): void + { + $this->authorize('manageKeys', $this->token); + + $this->token->secureShellKeys()->sync($this->selectedOptions); + + $this->toast(trans('tokens.secure-shell-keys.store_success'), 'success'); + + redirect()->to(route('tokens.show', $this->token)); + } + + public function storeKey(): void + { + $data = $this->validate([ + 'name' => [ + 'required', + 'max:255', + Rule::unique('secure_shell_keys', 'name')->where('user_id', Auth::id()), + ], + 'public_key' => [ + 'required', + new SecureShellKey(), + Rule::unique('secure_shell_keys', 'public_key')->where('user_id', Auth::id()), + ], + ]); + + $this->user->secureShellKeys()->create($data); + + $this->toast(trans('pages.user-settings.create_ssh_success'), 'success'); + + $this->name = null; + $this->public_key = null; + + if ($this->modalShown) { + $this->closeModal(); + } + + $this->emit('refreshSecureShellKeys'); + } + + public function toggleModal(): void + { + if ($this->modalShown) { + $this->closeModal(); + } else { + $this->openModal(); + } + } +} diff --git a/app/App/Token/Components/ManageTokens.php b/app/App/Token/Components/ManageTokens.php new file mode 100644 index 0000000..cf3c366 --- /dev/null +++ b/app/App/Token/Components/ManageTokens.php @@ -0,0 +1,79 @@ + 'selectToken', + 'setIndex' => 'setIndex', + ]; + + /** @var mixed */ + protected $queryString = [ + 'index' => ['except' => ''], + 'network' => ['except' => ''], + 'token' => ['except' => ''], + ]; + + public function mount(): void + { + $this->tokens = $this->user->tokens()->orderBy('name')->get(); + + if ($this->tokens->count() > 0) { + $this->selectedToken = $this->tokens->where('name', $this->token)->first() ?? $this->tokens->first(); + } else { + $this->selectedToken = null; + } + } + + public function render(): View + { + return view('livewire.manage-tokens', [ + 'tokens' => $this->tokens, + 'selectedToken' => $this->selectedToken, + ]); + } + + public function selectToken(int $id): void + { + $token = $this->user->tokens()->findOrFail($id); + + $this->token = $token->name; + + $this->selectedToken = $token; + } + + public function setIndex(int $id): void + { + $this->index = $id; + } + + public function editToken(int $id): void + { + $this->redirectRoute('tokens.show', $this->tokens->firstWhere('id', $id)); + } +} diff --git a/app/App/Token/Components/UpdateToken.php b/app/App/Token/Components/UpdateToken.php new file mode 100644 index 0000000..526415f --- /dev/null +++ b/app/App/Token/Components/UpdateToken.php @@ -0,0 +1,46 @@ + 'setDefaults', + 'setFeeDefaults' => 'setFeeDefaults', + ]; + + private function step1Rules(): array + { + /** @var User $user */ + $user = auth()->user(); + + return [ + 'chainName' => [ + 'required', 'max:32', 'alpha_dash', + Rule::unique('tokens', 'name') + ->where('user_id', $user->id) + ->whereNull('deleted_at') + ->ignore($this->tokenObject->id, 'id'), + ], + 'token' => ['required', 'max:6', 'alpha_num', new ReservedTokenName()], + 'symbol' => ['required', 'max:3'], + 'mainnetPrefix' => ['required', 'max:1', new AddressPrefix()], + 'devnetPrefix' => ['required', 'max:1', new AddressPrefix()], + 'testnetPrefix' => ['required', 'max:1', new AddressPrefix()], + ]; + } +} diff --git a/app/App/Token/Controllers/DeploymentConfigController.php b/app/App/Token/Controllers/DeploymentConfigController.php new file mode 100644 index 0000000..4c8a54a --- /dev/null +++ b/app/App/Token/Controllers/DeploymentConfigController.php @@ -0,0 +1,36 @@ +configurationPath(); + + if (! Storage::disk('token-config')->exists($path)) { + report(new RuntimeException('Trying to retrieve config.zip file for the token [ID: '.$network->token->id.'] but the file does not exist.')); + + return response('File not found!', 404); + } + + return Storage::disk('token-config')->download($path, 'config.zip'); + } + + public function store(Network $network, DeploymentConfigRequest $request): Response + { + $request->file->storeAs('', $network->configurationPath(), 'token-config'); + + return response()->noContent(); + } +} diff --git a/app/App/Token/Controllers/InstallationScriptController.php b/app/App/Token/Controllers/InstallationScriptController.php new file mode 100644 index 0000000..2403b5e --- /dev/null +++ b/app/App/Token/Controllers/InstallationScriptController.php @@ -0,0 +1,22 @@ +token, $network->name); + + return response()->streamDownload(function () use ($script) { + echo $script->script(); + }, 'install.sh'); + } +} diff --git a/app/App/Token/Controllers/TokenActivityController.php b/app/App/Token/Controllers/TokenActivityController.php new file mode 100644 index 0000000..a00e5d0 --- /dev/null +++ b/app/App/Token/Controllers/TokenActivityController.php @@ -0,0 +1,41 @@ +authorize('view', $token); + + $activity = Activity::causedBy($token)->latest()->paginate(); + + // Since user_id is stored in the `properties` column of the activity, we'll + // pre-load them here to prevent n+1 issues when displaying user's name in the UI. + /** @var \Illuminate\Support\Collection */ + $users = User::find( + $activity->getCollection() + ->map + ->userId() + ->filter() + ->unique() + ->values() + ); + + return view('app.tokens.activity', [ + 'token' => $token, + 'activities' => $activity->through(fn (Activity $activity) => [ + 'activity' => $activity, + 'user' => $users->firstWhere('id', $activity->userId()), + ]), + ]); + } +} diff --git a/app/App/Token/Controllers/TokenCollaboratorController.php b/app/App/Token/Controllers/TokenCollaboratorController.php new file mode 100644 index 0000000..cb23b81 --- /dev/null +++ b/app/App/Token/Controllers/TokenCollaboratorController.php @@ -0,0 +1,26 @@ +authorize('view', $token); + $this->authorizeAny(['createCollaborator', 'deleteCollaborator'], $token); + + if ($token->canBeEdited() && ! $token->onboarding()->available(TokenOnboardingStatusEnum::COLLABORATORS)) { + return redirect()->route('tokens.show', $token); + } + + return view('app.tokens.collaborators', ['token' => $token]); + } +} diff --git a/app/App/Token/Controllers/TokenController.php b/app/App/Token/Controllers/TokenController.php new file mode 100644 index 0000000..da33bc1 --- /dev/null +++ b/app/App/Token/Controllers/TokenController.php @@ -0,0 +1,36 @@ +authorize('view', $token); + + if (! $token->canBeEdited()) { + return redirect()->route('tokens.show', $token); + } + + return view('app.tokens.edit', ['token' => $token]); + } + + public function show(Token $token): RedirectResponse + { + $this->authorize('view', $token); + + return redirect()->route('tokens.details', [$token]); + } +} diff --git a/app/App/Token/Controllers/TokenDetailsController.php b/app/App/Token/Controllers/TokenDetailsController.php new file mode 100644 index 0000000..aa70556 --- /dev/null +++ b/app/App/Token/Controllers/TokenDetailsController.php @@ -0,0 +1,24 @@ +authorize('view', $token); + + $configuration = $token->config; + + return view('app.tokens.details', [ + 'token' => $token, + 'configuration' => $configuration, + ]); + } +} diff --git a/app/App/Token/Controllers/TokenInvitationController.php b/app/App/Token/Controllers/TokenInvitationController.php new file mode 100644 index 0000000..a224f9f --- /dev/null +++ b/app/App/Token/Controllers/TokenInvitationController.php @@ -0,0 +1,72 @@ +back()->with('status', self::ALERT_STATUS); + } + + $token = $invitation->token; + + /** @var User $user */ + $user = $request->user(); + + $token->shareWith($user, $invitation->role, $invitation->permissions); + + $invitation->delete(); + + alert('invitations.messages.accepted', FlashType::SUCCESS); + + $token->collaborators->each->notify(new CollaboratorAcceptedInvite($token, $user)); + + return redirect()->route('user.teams')->with('status', self::ALERT_STATUS); + } + + public static function canBeHandled(Request $request, ?Invitation $invitation): bool + { + if (is_null($invitation)) { + alert('invitations.messages.invitation_removed', FlashType::ERROR); + + return false; + } + + if ($invitation->isExpired()) { + alert('invitations.messages.invitation_expired', FlashType::ERROR); + + return false; + } + + if (is_null($invitation->user_id)) { + /** @var User $user */ + $user = $request->user(); + abort_unless($user->email === $invitation->email, 404); + } else { + abort_unless(Auth::id() === $invitation->user_id, 404); + } + + return true; + } +} diff --git a/app/App/Token/Controllers/TokenOnboardingController.php b/app/App/Token/Controllers/TokenOnboardingController.php new file mode 100644 index 0000000..3dc87e3 --- /dev/null +++ b/app/App/Token/Controllers/TokenOnboardingController.php @@ -0,0 +1,65 @@ +authorize('view', $token); + + if (! $token->canBeEdited()) { + return redirect()->route('tokens.show', $token); + } + + return view('app.tokens.onboard', ['token' => $token]); + } + + public function create(): View + { + // fetch existing draft token for user or create new, then redirect to onboarding + $token = Token::where('user_id', Auth::id())->currentStatus(TokenStatusEnum::PENDING)->first(); + + if ($token === null) { + // Create draft token that we use + $coin = Coin::where([ + 'name' => 'ARK', + 'symbol' => 'ARK', + ])->firstOrFail(); + + $token = Token::create([ + 'user_id' => Auth::id(), + 'coin_id' => $coin->id, + 'name' => Haiku::withToken(), + 'config' => null, + ]); + + $token->save(); + + TokenCreated::dispatch($token); + } + + return view('app.tokens.onboard', ['token' => $token]); + } + + public function update(Token $token): RedirectResponse + { + abort_unless($token->onboarding()->fulfilled(), 403); + + $token->update(['onboarded_at' => now()]); + + return redirect()->route('tokens', $token); + } +} diff --git a/app/App/Token/Controllers/TokenSecureShellKeyController.php b/app/App/Token/Controllers/TokenSecureShellKeyController.php new file mode 100644 index 0000000..9296366 --- /dev/null +++ b/app/App/Token/Controllers/TokenSecureShellKeyController.php @@ -0,0 +1,27 @@ +authorize('view', $token); + + if ($token->canBeEdited() && ! $token->onboarding()->available(TokenOnboardingStatusEnum::SECURE_SHELL_KEYS)) { + return redirect()->route('tokens.show', $token); + } + + return view('app.tokens.secure-shell-keys', [ + 'token' => $token, + ]); + } +} diff --git a/app/App/Token/Controllers/TokenServerActionController.php b/app/App/Token/Controllers/TokenServerActionController.php new file mode 100644 index 0000000..7131908 --- /dev/null +++ b/app/App/Token/Controllers/TokenServerActionController.php @@ -0,0 +1,64 @@ +authorize('update', $server); + + try { + $server->serverProvider->client()->start($server->provider_server_id); + + alert('tokens.servers.actions.started_success', FlashType::SUCCESS, ['server' => $server->name]); + } catch (Throwable) { + alert('tokens.servers.actions.started_failed', FlashType::ERROR, ['server' => $server->name]); + } + + return back(); + } + + public function stop(Token $token, Network $network, int $serverId): RedirectResponse + { + $server = Server::findOrFail($serverId); + $this->authorize('update', $server); + + try { + $server->serverProvider->client()->stop($server->provider_server_id); + + alert('tokens.servers.actions.stopped_success', FlashType::SUCCESS, ['server' => $server->name]); + } catch (Throwable) { + alert('tokens.servers.actions.stopped_failed', FlashType::ERROR, ['server' => $server->name]); + } + + return back(); + } + + public function reboot(Token $token, Network $network, int $serverId): RedirectResponse + { + $server = Server::findOrFail($serverId); + $this->authorize('update', $server); + + try { + $server->serverProvider->client()->reboot($server->provider_server_id); + + alert('tokens.servers.actions.rebooted_success', FlashType::SUCCESS, ['server' => $server->name]); + } catch (Throwable) { + alert('tokens.servers.actions.rebooted_failed', FlashType::ERROR, ['server' => $server->name]); + } + + return back(); + } +} diff --git a/app/App/Token/Controllers/TokenServerConfigurationController.php b/app/App/Token/Controllers/TokenServerConfigurationController.php new file mode 100644 index 0000000..b92bb78 --- /dev/null +++ b/app/App/Token/Controllers/TokenServerConfigurationController.php @@ -0,0 +1,31 @@ +authorize('view', $token); + + if (! $token->canBeEdited()) { + return redirect()->route('tokens.servers.index', $token); + } + + if (! $token->onboarding()->available(TokenOnboardingStatusEnum::SERVER_CONFIGURATION)) { + return redirect()->route('tokens.show', $token); + } + + return view('app.tokens.server-configuration', [ + 'token' => $token, + ]); + } +} diff --git a/app/App/Token/Controllers/TokenServerController.php b/app/App/Token/Controllers/TokenServerController.php new file mode 100644 index 0000000..c3008ae --- /dev/null +++ b/app/App/Token/Controllers/TokenServerController.php @@ -0,0 +1,51 @@ +authorize('view', $token); + + return view('app.tokens.servers.index', [ + 'token' => $token, + ]); + } + + public function create(Token $token, Network $network): View + { + $this->authorize('create', [Server::class, $token]); + + return view('app.tokens.servers.create', [ + 'token' => $token, + 'network' => $network, + ]); + } + + public function show(Token $token, Network $network, int $serverId): View|RedirectResponse + { + // This method does not use model binding to bind Server model because in the Blade template we render a Livewire component... + // However, since we want to display Deployment Failed modal even if the Server model is deleted, we can't use model binding + // as that will (for some weird reason) automatically throw 404 modal when Livewire component is hydrated... + + $server = Server::findOrFail($serverId); + + $this->authorize('view', $server); + + return view('app.tokens.servers.show', [ + 'token' => $token, + 'network' => $network, + 'server' => $server, + ]); + } +} diff --git a/app/App/Token/Controllers/TokenServerProviderController.php b/app/App/Token/Controllers/TokenServerProviderController.php new file mode 100644 index 0000000..14d59b0 --- /dev/null +++ b/app/App/Token/Controllers/TokenServerProviderController.php @@ -0,0 +1,27 @@ +authorize('view', $token); + + if ($token->canBeEdited() && ! $token->onboarding()->available(TokenOnboardingStatusEnum::SERVER_PROVIDERS)) { + return redirect()->route('tokens.show', $token); + } + + return view('app.tokens.server-providers', [ + 'token' => $token, + ]); + } +} diff --git a/app/App/Token/Notifications/TokenDeleted.php b/app/App/Token/Notifications/TokenDeleted.php new file mode 100644 index 0000000..6a21ec3 --- /dev/null +++ b/app/App/Token/Notifications/TokenDeleted.php @@ -0,0 +1,34 @@ +fromToken($this->token, [ + 'content' => trans('notifications.subjects.token_deleted', ['token' => $this->token->name]), + ]) + ->success() + ->getContent(); + } +} diff --git a/app/App/Token/Requests/DeploymentConfigRequest.php b/app/App/Token/Requests/DeploymentConfigRequest.php new file mode 100644 index 0000000..fa9708f --- /dev/null +++ b/app/App/Token/Requests/DeploymentConfigRequest.php @@ -0,0 +1,22 @@ + ['file', 'required', 'mimetypes:application/zip', 'min:1', 'max:50'], + ]; + } +} diff --git a/app/App/User/Components/ManageSecureShellKeys.php b/app/App/User/Components/ManageSecureShellKeys.php new file mode 100644 index 0000000..f34cff0 --- /dev/null +++ b/app/App/User/Components/ManageSecureShellKeys.php @@ -0,0 +1,24 @@ + '$refresh']; + + public function getKeysProperty(): Collection + { + return $this->user->secureShellKeys; + } +} diff --git a/app/App/User/Components/UpdateUserAccount.php b/app/App/User/Components/UpdateUserAccount.php new file mode 100644 index 0000000..111b1ab --- /dev/null +++ b/app/App/User/Components/UpdateUserAccount.php @@ -0,0 +1,179 @@ +has(['email', 'signature'])) { + // @phpstan-ignore-next-line + if (! $request->hasValidSignature()) { + $this->invalidLink = true; + } elseif ($this->emailConfirmationLinkExpired($request)) { + $this->expiredLink = true; + } else { + $this->updateEmail($request->input('email')); + } + + // We want to remove the signature from the query string so it's not persisted if the user refreshes the page... + $this->signature = null; + } + + $this->name = $this->user->name; + $this->email = $this->user->email; + } + + public function update() : void + { + Validator::make([ + 'name' => $this->name, + 'email' => $this->email, + ], $this->validationRules())->validate(); + + $this->user->fill([ + 'name' => $this->name, + 'email' => $this->email, + ]); + + // If user wants to change email, we want to first have them confirm this change... + if ($this->user->isDirty('email')) { + $this->confirmEmailChangeModal = true; + + return; + } + + $this->user->save(); + + $this->toast(trans('pages.user-settings.profile.saved')); + } + + public function closeEmailConfirmationModal() : void + { + $this->confirmEmailChangeModal = false; + $this->confirmEmailChangeModalConfirmed = false; + $this->password = ''; + + $this->closeModal(); + } + + public function confirmEmailChange() : void + { + $this->validate([ + 'password' => ['required', 'string', new CurrentPassword($this->user)], + ]); + + $this->user->sendEmailChangeConfirmationMail($this->email); + + $this->confirmEmailChangeModalConfirmed = true; + } + + public function cancelConfirmationEmail() : void + { + $this->user->forgetMetaAttribute('email_to_update'); + $this->user->forgetMetaAttribute('email_to_update_stored_at'); + } + + public function resendConfirmationEmail() : void + { + $pendingEmail = $this->user->getMetaAttribute('email_to_update'); + + // User has confirmed & updated the email in the meanwhile, so just refresh to avoid weird state... + if ($pendingEmail === '' || $pendingEmail === null) { + $this->redirectRoute('user.profile'); + + return; + } + + $this->user->sendEmailChangeConfirmationMail($this->user->getMetaAttribute('email_to_update')); + + $this->toast(trans('pages.user-settings.email-change.resend')); + } + + public function closeEmailUpdatedFeedbackModal() : void + { + $this->emailUpdated = false; + $this->invalidLink = false; + $this->expiredLink = false; + + $this->closeModal(); + } + + public function render() : Renderable + { + return view('livewire.update-user-account'); + } + + private function validationRules() : array + { + return [ + 'email' => ['required', 'max:255', 'email', Rule::unique('users')->ignore($this->user)], + 'name' => 'required|string|max:50', + ]; + } + + private function updateEmail(string $email) : void + { + $this->user->update([ + 'email' => strtolower($email), + ]); + + $this->user->forgetMetaAttribute('email_to_update'); + $this->user->forgetMetaAttribute('email_to_update_stored_at'); + + $this->emailUpdated = true; + } + + private function emailConfirmationLinkExpired(Request $request) : bool + { + $pendingEmail = $this->user->getMetaAttribute('email_to_update'); + + if ($pendingEmail === null) { + return true; + } + + return strtolower($request->input('email')) !== strtolower($pendingEmail) + ? true + : Carbon::now()->gte(Carbon::createFromTimestamp($request->input('expires'))); + } +} diff --git a/app/App/User/Mail/ConfirmEmailChange.php b/app/App/User/Mail/ConfirmEmailChange.php new file mode 100644 index 0000000..cad3ddd --- /dev/null +++ b/app/App/User/Mail/ConfirmEmailChange.php @@ -0,0 +1,41 @@ +subject($subject = trans('mails.subjects.email-confirm-change'))->view('mails.confirm-email-change', [ + 'subject' => $subject, + 'name' => $this->name, + 'url' => $this->confirmationUrl(), + ]); + } + + private function confirmationUrl() : string + { + $ttl = now()->addHours(24); + + return URL::temporarySignedRoute('user.profile', $ttl, [ + 'email' => $this->email, + ]); + } +} diff --git a/app/App/User/Mail/PersonalDataExport.php b/app/App/User/Mail/PersonalDataExport.php new file mode 100644 index 0000000..7d1bead --- /dev/null +++ b/app/App/User/Mail/PersonalDataExport.php @@ -0,0 +1,35 @@ +zipFilename); + + // @codeCoverageIgnoreStart + if (static::$toMailCallback !== null) { + return call_user_func(static::$toMailCallback, $notifiable, $downloadUrl); + } + // @codeCoverageIgnoreEnd + + return (new MailMessage()) + ->subject(trans('mails.subjects.download_personal_data')) + ->view('mails.personal-data-export', [ + 'subject' => trans('mails.subjects.download_personal_data'), + 'url' => $downloadUrl, + 'date' => $this->deletionDatetime->format('Y-m-d H:i:s'), + ]); + } +} diff --git a/app/App/View/Components/BlockchainLogo.php b/app/App/View/Components/BlockchainLogo.php new file mode 100644 index 0000000..7d25b38 --- /dev/null +++ b/app/App/View/Components/BlockchainLogo.php @@ -0,0 +1,39 @@ +size) { + 'small' => 'w-11 h-11', + default => 'w-20 h-20', + }; + } + + public function rounded(): string + { + return match ($this->size) { + 'small' => 'rounded', + default => 'rounded-xl', + }; + } +} diff --git a/app/App/View/Components/SortByButton.php b/app/App/View/Components/SortByButton.php new file mode 100644 index 0000000..e5d4173 --- /dev/null +++ b/app/App/View/Components/SortByButton.php @@ -0,0 +1,25 @@ +hasMany(Token::class); + } + + public function getSlugOptions(): SlugOptions + { + return SlugOptions::create() + ->generateSlugsFrom('name') + ->saveSlugsTo('slug') + ->slugsShouldBeNoLongerThan(95); // 100 but room for suffix + } +} diff --git a/app/Domain/Collaborator/Actions/InviteCollaboratorAction.php b/app/Domain/Collaborator/Actions/InviteCollaboratorAction.php new file mode 100644 index 0000000..65574ea --- /dev/null +++ b/app/Domain/Collaborator/Actions/InviteCollaboratorAction.php @@ -0,0 +1,58 @@ +emailAlreadyOnToken($token, $email)) { + throw ValidationException::withMessages([ + 'email' => trans('tokens.user_already_on_token', ['email' => $email]), + ]); + } + + if ($this->emailAlreadyInvited($token, $email)) { + throw ValidationException::withMessages([ + 'email' => trans('tokens.user_already_invited_to_token', ['email' => $email]), + ]); + } + + $invitedUser = User::where('email', $email)->first(); + + $invitation = $token->invitations()->create([ + 'uuid' => Uuid::uuid4(), + 'user_id' => $invitedUser?->id, + 'role' => 'collaborator', + 'permissions' => $permissions, + 'email' => $email, + ]); + + if (is_null($invitation->user_id)) { + Mail::to($invitation->email)->send(new InviteNewUser($invitation)); + } else { + /** @var User $invitedUser */ + $invitedUser->notify(new InviteExistingUser($invitation)); + } + } + + private function emailAlreadyOnToken(Token $token, string $email): bool + { + return $token->collaborators()->where('email', $email)->exists(); + } + + private function emailAlreadyInvited(Token $token, string $email): bool + { + return $token->invitations()->where('email', $email)->exists(); + } +} diff --git a/app/Domain/Collaborator/Models/Collaborator.php b/app/Domain/Collaborator/Models/Collaborator.php new file mode 100644 index 0000000..1cd4798 --- /dev/null +++ b/app/Domain/Collaborator/Models/Collaborator.php @@ -0,0 +1,37 @@ + 'json']; + + public static function availablePermissions(): array + { + return [ + 'token:delete', + 'token:update', + 'collaborator:create', + 'collaborator:delete', + 'server-provider:create', + 'server-provider:delete', + 'server-provider:update', + 'server:create', + 'server:delete', + 'server:rename', + 'server:restart', + 'server:start', + 'server:stop', + 'ssh-key:manage', + ]; + } +} diff --git a/app/Domain/Collaborator/Models/Invitation.php b/app/Domain/Collaborator/Models/Invitation.php new file mode 100644 index 0000000..59fd793 --- /dev/null +++ b/app/Domain/Collaborator/Models/Invitation.php @@ -0,0 +1,45 @@ + 'json']; + + public function token(): BelongsTo + { + return $this->belongsTo(Token::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function isExpired(): bool + { + return Carbon::now()->subWeek()->gte($this->created_at); + } + + public static function findByUuid(string $token): self + { + return static::where('uuid', $token)->firstOrFail(); + } +} diff --git a/app/Domain/SecureShell/Contracts/Script.php b/app/Domain/SecureShell/Contracts/Script.php new file mode 100644 index 0000000..98a55e1 --- /dev/null +++ b/app/Domain/SecureShell/Contracts/Script.php @@ -0,0 +1,36 @@ +belongsToMany(Token::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function fingerprint() : string + { + // Segments of a public key: algorithm / public key contents / identifier (email) + $segments = explode(' ', $this->public_key, 3); + $contents = (string) base64_decode($segments[1], true); + + return implode(':', str_split(md5($contents), 2)); + } + + protected static function booted() : void + { + static::saving(function (self $model) : void { + $model->fill([ + 'fingerprint' => $model->fingerprint(), + ]); + }); + } +} diff --git a/app/Domain/SecureShell/Policies/SecureShellKeyPolicy.php b/app/Domain/SecureShell/Policies/SecureShellKeyPolicy.php new file mode 100644 index 0000000..8385159 --- /dev/null +++ b/app/Domain/SecureShell/Policies/SecureShellKeyPolicy.php @@ -0,0 +1,19 @@ +user->id === $user->id; + } +} diff --git a/app/Domain/SecureShell/Rules/SecureShellKey.php b/app/Domain/SecureShell/Rules/SecureShellKey.php new file mode 100644 index 0000000..fa9bc6e --- /dev/null +++ b/app/Domain/SecureShell/Rules/SecureShellKey.php @@ -0,0 +1,43 @@ +coin->name).'.'.strtolower($token->name); + + if (view()->exists($scriptPrefix.$scriptTokenPath.'.'.$scriptType)) { + return $scriptPrefix.$scriptTokenPath.'.'.$scriptType; + } + + return $scriptPrefix.strtolower($token->coin->name).'.'.strtolower($token->coin->symbol).'.'.$scriptType; + } +} diff --git a/app/Domain/SecureShell/Scripts/Concerns/ManagesScriptVariables.php b/app/Domain/SecureShell/Scripts/Concerns/ManagesScriptVariables.php new file mode 100644 index 0000000..c2123a8 --- /dev/null +++ b/app/Domain/SecureShell/Scripts/Concerns/ManagesScriptVariables.php @@ -0,0 +1,47 @@ +server->token; + $network = $this->server->network; + + $result = array_merge((array) $token->config, $attributes, [ + // All + 'username' => $this->user(), + 'user_password' => $this->server->user_password, + 'sudo_password' => $this->server->sudo_password, + 'privateKey' => $token->getPrivateKey(), + 'publicKey' => $token->keypair['publicKey'] ?? '', + 'authorizedKeys' => $this->server->getAuthorizedKeys(), + 'token' => $this->user(), + 'name' => $token->name, + 'network' => $network->name, + 'epoch' => $network->epoch(), + 'ipAddress' => $this->server->ip_address, + 'addressPrefix' => $network->base58Prefix(), + 'server' => $this->server, + 'explorerPath' => '$HOME/core-explorer', + // These are temporary URLs available during installation. They are no longer accessible after 30 minutes. + 'coreVersion' => URL::temporarySignedRoute('server.deployment.status', now()->addMinutes(30), ['server' => $this->server->id]), + 'deploymentStatus' => URL::temporarySignedRoute('server.deployment.status', now()->addMinutes(30), ['server' => $this->server->id]), + 'storeConfigUrl' => URL::temporarySignedRoute('server.deployment.config.store', now()->addMinutes(30), ['network' => $network->id]), + 'getConfigUrl' => URL::temporarySignedRoute('server.deployment.config.show', now()->addMinutes(30), ['network' => $network->id]), + 'installationScriptUrl' => URL::temporarySignedRoute('server.deployment.installation-script.show', now()->addMinutes(30), ['network' => $network->id]), + ]); + + if (array_key_exists('databaseName', $result)) { + $result['databaseName'] = Str::snake(strtolower($result['databaseName'])); + } + + return $result; + } +} diff --git a/app/Domain/SecureShell/Scripts/ManualScript.php b/app/Domain/SecureShell/Scripts/ManualScript.php new file mode 100644 index 0000000..c08a647 --- /dev/null +++ b/app/Domain/SecureShell/Scripts/ManualScript.php @@ -0,0 +1,56 @@ +token->network($this->network); + + return View::make( + $this->getScriptPath($this->token, 'provision-manual'), + array_merge((array) $this->token->config, [ + 'token' => $this->user(), + 'name' => $this->token->name, + 'peers' => $network->getGenesis()->ip_address, + 'network' => $network->name, + 'epoch' => $network->epoch(), + 'addressPrefix' => $network->base58Prefix(), + 'explorerPath' => '\\'.'$HOME/core-explorer', + ]) + )->render(); + } + + public function user(): string + { + return $this->token->normalized_token; + } + + public function timeout(): int + { + return ServerTask::DEFAULT_TIMEOUT; + } +} diff --git a/app/Domain/SecureShell/Scripts/ProvisionExplorer.php b/app/Domain/SecureShell/Scripts/ProvisionExplorer.php new file mode 100644 index 0000000..bd1cac8 --- /dev/null +++ b/app/Domain/SecureShell/Scripts/ProvisionExplorer.php @@ -0,0 +1,49 @@ +token = $server->token; + } + + public function name(): string + { + return trans('scripts.names.provision_explorer', ['server' => $this->server->name]); + } + + public function script(): string + { + return View::make( + $this->getScriptPath($this->token, 'provision-explorer'), + $this->makeScriptVariables() + )->render(); + } + + public function user(): string + { + return $this->token->normalized_token ?? ''; + } + + public function timeout(): int + { + return ServerTask::DEFAULT_TIMEOUT; + } +} diff --git a/app/Domain/SecureShell/Scripts/ProvisionForger.php b/app/Domain/SecureShell/Scripts/ProvisionForger.php new file mode 100644 index 0000000..9686684 --- /dev/null +++ b/app/Domain/SecureShell/Scripts/ProvisionForger.php @@ -0,0 +1,53 @@ +token = $server->token; + } + + public function name(): string + { + return trans('scripts.names.provision_forger', ['server' => $this->server->name]); + } + + public function script(): string + { + return View::make( + $this->getScriptPath($this->token, 'provision-forger'), + $this->makeScriptVariables([ + 'passphrase' => $this->server->delegate_passphrase, + 'passphrasePassword' => $this->server->delegate_password, // only relevant for bip38 + 'passphraseMethod' => is_null($this->server->delegate_password) ? 'bip39' : 'bip38', + ]) + )->render(); + } + + public function user(): string + { + return $this->token->normalized_token; + } + + public function timeout(): int + { + return ServerTask::DEFAULT_TIMEOUT; + } +} diff --git a/app/Domain/SecureShell/Scripts/ProvisionGenesis.php b/app/Domain/SecureShell/Scripts/ProvisionGenesis.php new file mode 100644 index 0000000..7105810 --- /dev/null +++ b/app/Domain/SecureShell/Scripts/ProvisionGenesis.php @@ -0,0 +1,52 @@ +token = $server->token; + } + + public function name(): string + { + return trans('scripts.names.provision_genesis', ['server' => $this->server->name]); + } + + public function script(): string + { + return View::make( + $this->getScriptPath($this->token, 'provision-genesis'), + $this->makeScriptVariables([ + 'explorerPath' => '\\'.'$HOME/core-explorer', + 'tokenPath' => '\\'.'$HOME/core-token', + ]) + )->render(); + } + + public function user(): string + { + return $this->token->normalized_token; + } + + public function timeout(): int + { + return ServerTask::DEFAULT_TIMEOUT; + } +} diff --git a/app/Domain/SecureShell/Scripts/ProvisionRelay.php b/app/Domain/SecureShell/Scripts/ProvisionRelay.php new file mode 100644 index 0000000..145a8fd --- /dev/null +++ b/app/Domain/SecureShell/Scripts/ProvisionRelay.php @@ -0,0 +1,49 @@ +token = $server->token; + } + + public function name(): string + { + return trans('scripts.names.provision_relay', ['server' => $this->server->name]); + } + + public function script(): string + { + return View::make( + $this->getScriptPath($this->token, 'provision-relay'), + $this->makeScriptVariables() + )->render(); + } + + public function user(): string + { + return $this->token->normalized_token; + } + + public function timeout(): int + { + return ServerTask::DEFAULT_TIMEOUT; + } +} diff --git a/app/Domain/SecureShell/Scripts/ProvisionSeed.php b/app/Domain/SecureShell/Scripts/ProvisionSeed.php new file mode 100644 index 0000000..25dfe7d --- /dev/null +++ b/app/Domain/SecureShell/Scripts/ProvisionSeed.php @@ -0,0 +1,49 @@ +token = $server->token; + } + + public function name(): string + { + return trans('scripts.names.provision_seed', ['server' => $this->server->name]); + } + + public function script(): string + { + return View::make( + $this->getScriptPath($this->token, 'provision-seed'), + $this->makeScriptVariables() + )->render(); + } + + public function user(): string + { + return $this->token->normalized_token; + } + + public function timeout(): int + { + return ServerTask::DEFAULT_TIMEOUT; + } +} diff --git a/app/Domain/SecureShell/Scripts/ProvisionUser.php b/app/Domain/SecureShell/Scripts/ProvisionUser.php new file mode 100644 index 0000000..535d717 --- /dev/null +++ b/app/Domain/SecureShell/Scripts/ProvisionUser.php @@ -0,0 +1,53 @@ + $this->server->name]); + } + + public function script(): string + { + $token = $this->server->token; + + return View::make($this->getScriptPath($token, 'provision-user'), [ + 'username' => $token->normalized_token, + 'preset' => $this->server->preset, + 'user_password' => $this->server->user_password, + 'sudo_password' => $this->server->sudo_password, + 'privateKey' => $token->getPrivateKey(), + 'publicKey' => $token->keypair['publicKey'] ?? '', + 'authorizedKeys' => $this->server->getAuthorizedKeys(), + // These are temporary URLs available during installation. They are no longer accessible after 30 minutes. + 'deploymentStatus' => URL::temporarySignedRoute('server.deployment.status', now()->addMinutes(30), ['server' => $this->server->id]), + ])->render(); + } + + public function user(): string + { + return 'root'; + } + + public function timeout(): int + { + return ServerTask::DEFAULT_TIMEOUT; + } +} diff --git a/app/Domain/SecureShell/Services/SecureShell.php b/app/Domain/SecureShell/Services/SecureShell.php new file mode 100644 index 0000000..db77a4a --- /dev/null +++ b/app/Domain/SecureShell/Services/SecureShell.php @@ -0,0 +1,144 @@ +ensureWorkingDirectoryExists(); + + $this->upload(); + } catch (ProcessTimedOutException) { + return $this->task->markAsTimedOut(); + } + + $output = $this->runInline(sprintf( + 'bash %s 2>&1 | tee %s', + $this->scriptFile(), + $this->outputFile() + ), $this->task->options['timeout'] ?? 60); + + return $this->updateForResponse($output); + } + + public function runWithUser(): ServerTask + { + try { + $this->upload(); + } catch (ProcessTimedOutException) { + return $this->task->markAsTimedOut(); + } + + $output = $this->runInline(sprintf( + 'su - %s -c "bash %s 2>&1" | tee %s', + $this->task->user, + $this->scriptFile(), + $this->outputFile() + ), $this->task->options['timeout'] ?? 60); + + return $this->updateForResponse($output); + } + + private function updateForResponse(ShellResponse $response): ServerTask + { + $this->task->setStatus($response->timedOut ? 'timeout' : 'finished'); + + return tap($this->task)->update([ + 'exit_code' => $response->exitCode, + 'output' => $response->output, + ]); + } + + private function ensureWorkingDirectoryExists(): void + { + $this->runInline('mkdir -p '.$this->path(), 10); + } + + private function upload(): void + { + $process = Process::fromShellCommandline(SecureShellCommand::forUpload( + $this->task->ipAddress(), + $this->task->port(), + $this->task->ownerKeyPath(), + $this->rootUser, + $localScript = $this->writeScript(), + $this->scriptFile() + ), base_path())->setTimeout(15); + + $response = ShellProcessRunner::run($process); + + unlink($localScript); + } + + private function writeScript(): string + { + $hash = md5(Str::random(20).$this->task->script); + + if (! is_dir(storage_path('app/scripts'))) { + mkdir(storage_path('app/scripts'), 0755, true); + } + + return tap(storage_path('app/scripts').'/'.$hash, fn ($path) => file_put_contents($path, $this->task->script)); + } + + private function runInline(string $script, int $timeout = 60): ShellResponse + { + $token = Str::random(20); + + return ShellProcessRunner::run($this->toProcess('\'bash -s \' << \''.$token.'\' +'.$script.' +'.$token, $timeout)); + } + + private function path(): string + { + return "/home/{$this->rootUser}/.deployer"; + } + + private function scriptFile(): string + { + return $this->getPath().'.sh'; + } + + private function outputFile(): string + { + return $this->getPath().'.out'; + } + + private function toProcess(string $script, int $timeout): Process + { + return Process::fromShellCommandline( + SecureShellCommand::forScript( + $this->task->ipAddress(), + $this->task->port(), + $this->task->ownerKeyPath(), + $this->rootUser, + $script + ) + )->setTimeout($timeout); + } + + private function getPath(): string + { + return $this->path().'/'.Str::snake(class_basename($this->task->type)); + } +} diff --git a/app/Domain/SecureShell/Services/SecureShellCommand.php b/app/Domain/SecureShell/Services/SecureShellCommand.php new file mode 100644 index 0000000..6b45499 --- /dev/null +++ b/app/Domain/SecureShell/Services/SecureShellCommand.php @@ -0,0 +1,31 @@ +run(); + + [$publicKey, $privateKey] = [ + file_get_contents(storage_path('app/'.$name.'.pub')), + file_get_contents(storage_path('app/'.$name)), + ]; + + File::delete(storage_path('app/'.$name.'.pub')); + File::delete(storage_path('app/'.$name)); + + return [ + 'publicKey' => $publicKey, + 'privateKey' => $privateKey, + ]; + } + + public function storeFor(Token $token): string + { + return tap(storage_path('app/keys/'.$token->id), function ($path) use ($token): void { + $this->ensureKeyDirectoryExists(); + + $this->ensureFileExists($path, $token->getPrivateKey(), 0600); + }); + } + + private function ensureKeyDirectoryExists(): void + { + if (! is_dir(storage_path('app/keys'))) { + mkdir(storage_path('app/keys'), 0755, true); + } + } + + private function ensureFileExists(string $path, string $contents, int $chmod): void + { + file_put_contents($path, $contents); + + chmod($path, $chmod); + } +} diff --git a/app/Domain/SecureShell/Services/ShellProcessRunner.php b/app/Domain/SecureShell/Services/ShellProcessRunner.php new file mode 100644 index 0000000..77ce3dc --- /dev/null +++ b/app/Domain/SecureShell/Services/ShellProcessRunner.php @@ -0,0 +1,23 @@ +run(); + } catch (ProcessTimedOutException) { + $timedOut = true; + } + + return new ShellResponse($process->getExitCode(), $process->getOutput(), $timedOut ?? false); + } +} diff --git a/app/Domain/SecureShell/Services/ShellResponse.php b/app/Domain/SecureShell/Services/ShellResponse.php new file mode 100644 index 0000000..75e4880 --- /dev/null +++ b/app/Domain/SecureShell/Services/ShellResponse.php @@ -0,0 +1,12 @@ + + */ + public function cast(mixed $value): Collection + { + return new Collection(array_map( + fn (mixed $data) => is_a($data, Image::class) ? $data : new Image(...$data), + $value + )); + } +} diff --git a/app/Domain/Server/DTO/Casters/PlanCollectionCaster.php b/app/Domain/Server/DTO/Casters/PlanCollectionCaster.php new file mode 100644 index 0000000..1d6cc01 --- /dev/null +++ b/app/Domain/Server/DTO/Casters/PlanCollectionCaster.php @@ -0,0 +1,26 @@ + + */ + public function cast(mixed $value): Collection + { + return new Collection(array_map( + fn (mixed $data) => is_a($data, Plan::class) ? $data : new Plan(...$data), + $value + )); + } +} diff --git a/app/Domain/Server/DTO/Casters/RegionCollectionCaster.php b/app/Domain/Server/DTO/Casters/RegionCollectionCaster.php new file mode 100644 index 0000000..8578490 --- /dev/null +++ b/app/Domain/Server/DTO/Casters/RegionCollectionCaster.php @@ -0,0 +1,26 @@ + + */ + public function cast(mixed $value): Collection + { + return new Collection(array_map( + fn (mixed $data) => is_a($data, Region::class) ? $data : new Region(...$data), + $value + )); + } +} diff --git a/app/Domain/Server/DTO/Image.php b/app/Domain/Server/DTO/Image.php new file mode 100644 index 0000000..cc66071 --- /dev/null +++ b/app/Domain/Server/DTO/Image.php @@ -0,0 +1,16 @@ + */ + #[CastWith(ImageCollectionCaster::class)] + public Collection $items; +} diff --git a/app/Domain/Server/DTO/Plan.php b/app/Domain/Server/DTO/Plan.php new file mode 100644 index 0000000..1ec4ce9 --- /dev/null +++ b/app/Domain/Server/DTO/Plan.php @@ -0,0 +1,28 @@ + */ + #[CastWith(PlanCollectionCaster::class)] + public Collection $items; +} diff --git a/app/Domain/Server/DTO/Region.php b/app/Domain/Server/DTO/Region.php new file mode 100644 index 0000000..7bbe1ff --- /dev/null +++ b/app/Domain/Server/DTO/Region.php @@ -0,0 +1,16 @@ + */ + #[CastWith(RegionCollectionCaster::class)] + public Collection $items; +} diff --git a/app/Domain/Server/DTO/SecureShellKey.php b/app/Domain/Server/DTO/SecureShellKey.php new file mode 100644 index 0000000..8dc7a45 --- /dev/null +++ b/app/Domain/Server/DTO/SecureShellKey.php @@ -0,0 +1,16 @@ + array_merge( + $this->serverStates(), + $this->coreStates(['genesis' => true]), + $this->explorerStates(), + $this->finalizingStates(), + ), + ]; + } + + public function getSeedStates(): array + { + return [ + 'seed' => array_merge( + $this->serverStates(), + $this->coreStates(), + $this->finalizingStates(), + ), + ]; + } + + public function getRelayStates(): array + { + return [ + 'relay' => array_merge( + $this->serverStates(), + $this->coreStates(), + $this->finalizingStates(), + ), + ]; + } + + public function getForgerStates(): array + { + return [ + 'forger' => array_merge( + $this->serverStates(), + $this->coreStates(['forger' => true]), + $this->finalizingStates(), + ), + ]; + } + + public function getExplorerStates(): array + { + return [ + 'explorer' => array_merge( + $this->serverStates(), + $this->coreStates(), + $this->explorerStates(), + $this->finalizingStates(), + ), + ]; + } + + public function getGroupStates(): array + { + return array_merge( + $this->getGenesisStates(), + $this->getSeedStates(), + $this->getRelayStates(), + $this->getForgerStates(), + $this->getExplorerStates(), + ); + } + + private function serverStates(): array + { + return [ + 'server' => [ + self::PROVISIONING, + self::CONFIGURING_LOCALE, + self::INSTALLING_SYSTEM_DEPENDENCIES, + self::INSTALLING_NODEJS, + self::INSTALLING_YARN, + self::INSTALLING_PM2, + self::INSTALLING_PROGRAM_DEPENDENCIES, + self::INSTALLING_POSTGRESQL, + self::INSTALLING_NTP, + self::INSTALLING_JEMALLOC, + self::UPDATING_SYSTEM, + self::SECURING_NODE, + ], + ]; + } + + private function coreStates(array $options = []): array + { + $states = [ + self::INSTALLING_CORE, + self::CREATING_CORE_ALIAS, + self::GENERATING_NETWORK_CONFIGURATION, + self::STORE_CONFIG, + self::FETCH_CONFIG, + self::CONFIGURING_DATABASE, + self::CONFIGURING_FORGER, + ]; + + if (! array_key_exists('genesis', $options)) { + $states = array_diff($states, [self::GENERATING_NETWORK_CONFIGURATION, self::STORE_CONFIG]); + } else { + $states = array_diff($states, [self::FETCH_CONFIG]); + } + + if (! array_key_exists('forger', $options)) { + $states = array_diff($states, [self::CONFIGURING_FORGER]); + } + + return [ + 'core' => $states, + ]; + } + + private function explorerStates(): array + { + $states = [ + self::INSTALLING_DOCKER, + self::CLONING_EXPLORER, + self::CONFIGURING_EXPLORER, + self::BUILDING_EXPLORER, + ]; + + return [ + 'explorer' => $states, + ]; + } + + private function finalizingStates(): array + { + return [ + 'finalizing' => [ + self::STARTING_PROCESSES, + self::CREATING_BOOT_SCRIPT, + self::PROVISIONED, + ], + ]; + } +} diff --git a/app/Domain/Server/Enums/ServerTaskStatusEnum.php b/app/Domain/Server/Enums/ServerTaskStatusEnum.php new file mode 100644 index 0000000..6de134c --- /dev/null +++ b/app/Domain/Server/Enums/ServerTaskStatusEnum.php @@ -0,0 +1,33 @@ + 'datetime', + 'provisioned_at' => 'datetime', + 'extra_attributes' => 'array', + 'sudo_password' => 'encrypted', + 'user_password' => 'encrypted', + 'delegate_passphrase' => 'encrypted', + 'delegate_password' => 'encrypted', + ]; + + protected array $enums = [ + 'preset' => PresetTypeEnum::class.':nullable', + ]; + + /** + * The event map for the model. + * + * @var array + */ + protected $dispatchesEvents = [ + 'deleted' => ServerDeleted::class, + 'updating' => ServerUpdating::class, + ]; + + public function creator() : ?User + { + return User::where('id', $this->getMetaAttribute(ServerAttributeEnum::CREATOR))->first(); + } + + public function token(): BelongsToThrough + { + return $this->belongsToThrough(Token::class, Network::class); + } + + public function network(): BelongsTo + { + return $this->belongsTo(Network::class); + } + + public function serverProvider(): BelongsTo + { + return $this->belongsTo(ServerProvider::class); + } + + public function plan(): HasOne + { + return $this->hasOne(ServerProviderPlan::class, 'id', 'server_provider_plan_id'); + } + + public function region(): HasOne + { + return $this->hasOne(ServerProviderRegion::class, 'id', 'server_provider_region_id'); + } + + public function image(): HasOne + { + return $this->hasOne(ServerProviderImage::class, 'id', 'server_provider_image_id'); + } + + public function tasks(): HasMany + { + return $this->hasMany(ServerTask::class); + } + + public function isGenesis(): bool + { + if ($this->preset !== null) { + return PresetTypeEnum::isGenesis($this->preset); + } + + return false; + } + + public function isSeed(): bool + { + if ($this->preset !== null) { + return PresetTypeEnum::isSeed($this->preset); + } + + return false; + } + + public function isRelay(): bool + { + if ($this->preset !== null) { + return PresetTypeEnum::isRelay($this->preset); + } + + return false; + } + + public function isForger(): bool + { + if ($this->preset !== null) { + return PresetTypeEnum::isForger($this->preset); + } + + return false; + } + + public function isExplorer(): bool + { + if ($this->preset !== null) { + return PresetTypeEnum::isExplorer($this->preset); + } + + return false; + } + + public function hasAuthorizedKeys(): bool + { + return (count($this->getAuthorizedKeys()) - 1) > 0; + } + + public function getAuthorizedKeys(): array + { + // Include user keys and our app's key + return array_merge( + $this->token->secureShellKeys()->pluck('public_key')->toArray(), + [$this->token->keypair['publicKey'] ?? []] + ); + } + + public function addTask(Script $script): ServerTask + { + $type = get_class($script); + + $task = $this->tasks()->whereType($type)->first(); + + if ($task !== null) { + return $task; + } + + $options = ['timeout' => $script->timeout()]; + + $task = $this->tasks()->create([ + 'type' => $type, + 'name' => $script->name(), + 'user' => $script->user(), + 'options' => $options, + 'script' => $script->script(), + 'output' => '', + ]); + + $task->setStatus('pending'); + + return $task; + } + + public function isReadyForProvisioning(): bool + { + if ($this->isProvisioning()) { + return false; + } + + return (bool) $this->ip_address; + } + + public function isProvisioning(): bool + { + return in_array($this->status, static::PROVISIONING_STATES, true); + } + + public function isProvisioned(): bool + { + return $this->provisioned_at !== null; + } + + public function isFailed(): bool + { + return $this->status === 'failed'; + } + + public function markAsOnline() : self + { + $this->setStatus('online'); + + return $this; + } + + public function isOnline() : bool + { + return $this->status === 'online'; + } + + public function markAsOffline() : self + { + $this->setStatus('offline'); + + return $this; + } + + public function isOffline() : bool + { + return $this->status === 'offline'; + } + + public function olderThan(int $minutes): bool + { + return $this->created_at?->lte(Carbon::now()->subMinutes($minutes)) ?? false; + } + + // We use those methods to get faster and more consistent access to commonly used nested URLs. + public function pathShow(): string + { + return route('tokens.servers.show', [$this->token, $this->network, $this]); + } + + public function pathStart(): string + { + return route('tokens.servers.start', [$this->token, $this->network, $this]); + } + + public function pathStop(): string + { + return route('tokens.servers.stop', [$this->token, $this->network, $this]); + } + + public function pathReboot(): string + { + return route('tokens.servers.reboot', [$this->token, $this->network, $this]); + } + + /** + * Perform any actions required after the model boots. + * + * @return void + */ + protected static function booted() : void + { + static::deleting(function (self $server) { + $server->tasks()->delete(); + }); + + static::creating(function (self $server) { + $server->user_password = PasswordGenerator::make(length: 32); + $server->sudo_password = PasswordGenerator::make(length: 32); + }); + } +} diff --git a/app/Domain/Server/Models/ServerProvider.php b/app/Domain/Server/Models/ServerProvider.php new file mode 100644 index 0000000..4766ea5 --- /dev/null +++ b/app/Domain/Server/Models/ServerProvider.php @@ -0,0 +1,79 @@ + 'array']; + + protected array $encryptedExtraAttributes = ['accessToken', 'accessKey']; + + protected $withCount = ['servers']; + + public function user() : ?User + { + return User::where('id', $this->getMetaAttribute(ServerAttributeEnum::CREATOR))->first(); + } + + public function token(): BelongsTo + { + return $this->belongsTo(Token::class); + } + + public function servers(): HasMany + { + return $this->hasMany(Server::class); + } + + public function plans(): BelongsToMany + { + return $this->belongsToMany(ServerProviderPlan::class); + } + + public function regions(): BelongsToMany + { + return $this->belongsToMany(ServerProviderRegion::class); + } + + public function images(): BelongsToMany + { + return $this->belongsToMany(ServerProviderImage::class); + } + + public function client(): ServerProviderClient + { + return ServerProviderClientFactory::make($this); + } + + public function allIndexed(): bool + { + $hasPlans = $this->plans->count() >= 1; + $hasRegions = $this->regions->count() >= 1; + $hasImages = $this->images->count() >= 1; + + return $hasPlans && $hasRegions && $hasImages; + } +} diff --git a/app/Domain/Server/Models/ServerProviderImage.php b/app/Domain/Server/Models/ServerProviderImage.php new file mode 100644 index 0000000..f5dc550 --- /dev/null +++ b/app/Domain/Server/Models/ServerProviderImage.php @@ -0,0 +1,24 @@ +belongsToMany(ServerProvider::class); + } + + public function servers(): HasMany + { + return $this->hasMany(Server::class); + } +} diff --git a/app/Domain/Server/Models/ServerProviderPlan.php b/app/Domain/Server/Models/ServerProviderPlan.php new file mode 100644 index 0000000..1e72f9a --- /dev/null +++ b/app/Domain/Server/Models/ServerProviderPlan.php @@ -0,0 +1,44 @@ + 'array']; + + public function serverProvider(): BelongsToMany + { + return $this->belongsToMany(ServerProvider::class); + } + + public function servers(): HasMany + { + return $this->hasMany(Server::class); + } + + public function getFormattedMemoryAttribute(): string + { + if ($this->memory < 1024) { + return $this->memory.'MB'; + } + + return round($this->memory / 1024, 0).'GB'; + } + + protected static function booted() + { + static::addGlobalScope( + 'resources', + fn (Builder $builder) => $builder->orderBy('cores')->orderBy('disk')->orderBy('memory') + ); + } +} diff --git a/app/Domain/Server/Models/ServerProviderRegion.php b/app/Domain/Server/Models/ServerProviderRegion.php new file mode 100644 index 0000000..f74e361 --- /dev/null +++ b/app/Domain/Server/Models/ServerProviderRegion.php @@ -0,0 +1,24 @@ +belongsToMany(ServerProvider::class); + } + + public function servers(): HasMany + { + return $this->hasMany(Server::class); + } +} diff --git a/app/Domain/Server/Models/ServerTask.php b/app/Domain/Server/Models/ServerTask.php new file mode 100644 index 0000000..755d717 --- /dev/null +++ b/app/Domain/Server/Models/ServerTask.php @@ -0,0 +1,123 @@ + 'array', + 'script' => 'encrypted', + ]; + + public function server(): BelongsTo + { + return $this->belongsTo(Server::class); + } + + public function isSuccessful(): bool + { + return $this->exit_code === 0; + } + + public function isPending(): bool + { + $lastStatus = $this->status(); + + return $lastStatus !== null && ServerTaskStatusEnum::isPending($lastStatus->name); + } + + public function isRunning(): bool + { + $lastStatus = $this->status(); + + return $lastStatus !== null && ServerTaskStatusEnum::isRunning($lastStatus->name); + } + + public function hasFailed(): bool + { + $lastStatus = $this->status(); + + return $lastStatus !== null && ServerTaskStatusEnum::isFailed($lastStatus->name); + } + + public function markAsRunning(): void + { + $this->setStatus(ServerTaskStatusEnum::RUNNING); + } + + public function markAsTimedOut(string $output = ''): self + { + $this->setStatus(ServerTaskStatusEnum::TIMEOUT); + + $this->server->setStatus('failed'); + + return tap($this)->update([ + 'exit_code' => 1, + 'output' => $output, + ]); + } + + public function markAsFinished(int $exitCode = 0, string $output = ''): self + { + $this->setStatus(ServerTaskStatusEnum::FINISHED); + + return tap($this)->update([ + 'exit_code' => $exitCode, + 'output' => $output, + ]); + } + + public function markAsFailed(int $exitCode = 0, string $output = ''): self + { + $this->setStatus(ServerTaskStatusEnum::FAILED); + + $this->server->setStatus('failed'); + + return tap($this)->update([ + 'exit_code' => $exitCode, + 'output' => $output, + ]); + } + + public function run(): self + { + $this->markAsRunning(); + + $shell = new SecureShell($this); + + return $this->user === 'root' ? $shell->run() : $shell->runWithUser(); + } + + public function ipAddress(): string + { + return $this->server->ip_address ?? ''; + } + + public function port(): int + { + return 22; + } + + public function ownerKeyPath(): string + { + return SecureShellKey::storeFor($this->server->token); + } +} diff --git a/app/Domain/Server/Policies/ServerPolicy.php b/app/Domain/Server/Policies/ServerPolicy.php new file mode 100644 index 0000000..8760bc2 --- /dev/null +++ b/app/Domain/Server/Policies/ServerPolicy.php @@ -0,0 +1,60 @@ +onToken($server->token); + } + + public function view(User $user, Server $server): bool + { + return $user->onToken($server->token); + } + + public function create(User $user, Token $token): bool + { + return $token->allows($user, 'server:create'); + } + + public function update(User $user, Server $server): bool + { + return $server->token->allows($user, 'server:update'); + } + + public function delete(User $user, Server $server): bool + { + return $server->token->allows($user, 'server:delete'); + } + + public function start(User $user, Server $server): bool + { + return $server->token->allows($user, 'server:start'); + } + + public function stop(User $user, Server $server): bool + { + return $server->token->allows($user, 'server:stop'); + } + + public function restart(User $user, Server $server): bool + { + return $server->token->allows($user, 'server:restart'); + } + + public function rename(User $user, Server $server): bool + { + return $server->token->allows($user, 'server:rename'); + } +} diff --git a/app/Domain/Server/Policies/ServerProviderPolicy.php b/app/Domain/Server/Policies/ServerProviderPolicy.php new file mode 100644 index 0000000..03f457f --- /dev/null +++ b/app/Domain/Server/Policies/ServerProviderPolicy.php @@ -0,0 +1,40 @@ +onToken($serverProvider->token); + } + + public function view(User $user, ServerProvider $serverProvider): bool + { + return $user->onToken($serverProvider->token); + } + + public function create(User $user, Token $token): bool + { + return $token->allows($user, 'server-provider:create'); + } + + public function update(User $user, ServerProvider $serverProvider): bool + { + return $serverProvider->token->allows($user, 'server-provider:update'); + } + + public function delete(User $user, ServerProvider $serverProvider): bool + { + return $serverProvider->token->allows($user, 'server-provider:delete'); + } +} diff --git a/app/Domain/Server/Services/Providers/AWS.php b/app/Domain/Server/Services/Providers/AWS.php new file mode 100644 index 0000000..eea40ad --- /dev/null +++ b/app/Domain/Server/Services/Providers/AWS.php @@ -0,0 +1,367 @@ +client = new Ec2Client([ + 'credentials' => [ + 'key' => $serverProvider->getMetaAttribute(ServerAttributeEnum::ACCESS_KEY), + 'secret' => $serverProvider->getMetaAttribute(ServerAttributeEnum::ACCESS_TOKEN), + ], + 'region' => config('aws.region'), + 'version' => config('aws.version'), + ]); + } + + /** + * Validate the access token. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html + * + * @return bool + */ + public function valid(): bool + { + try { + $this->client->describeInstances(); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Create a new server. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html + * + * @param ServerModel $serverToBeCreated + * + * @return Server + */ + public function create(ServerModel $serverToBeCreated): Server + { + $server = $this->client->runInstances([ + 'ImageId' => config('aws.imageIds.ubuntu-18-04-lts'), + 'MinCount' => 1, + 'MaxCount' => 1, + 'InstanceType' => $serverToBeCreated->plan->uuid, + ])->get('Instances'); + + return $this->server($server['InstanceId']); + } + + /** + * Retrieve the server for the given ID. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html + * + * @param int $id + * + * @return Server + */ + public function server($id): Server + { + $server = $this->client->describeInstances([ + 'Filter1.Name' => 'instance-id', + 'Filter1.Value' => $id, + ])->get('Reservations')[0]['Instances'][0]; + + $instanceType = $this->client->describeInstanceTypes([ + 'InstanceTypes' => [$server['InstanceType']], + ])->get('InstanceTypes')[0]; + + return new Server([ + 'id' => Arr::get($server, 'InstanceId'), + 'name' => Arr::get($server, 'InstanceType'), + 'plan' => Arr::get($server, 'InstanceType'), + 'memory' => (int) Arr::get($instanceType, 'MemoryInfo.SizeInMiB'), + 'cores' => (int) Arr::get($instanceType, 'VCpuInfo.DefaultVCpus'), + 'disk' => (int) Arr::get($instanceType, 'InstanceStorageInfo.TotalSizeInGB') * 1024, + 'region' => Arr::get($server, 'Placement.AvailabilityZone'), + 'status' => Arr::get($server, 'State.Name'), + 'remoteAddress' => Arr::get($server, 'NetworkInterfaces.0.Association.PublicIp'), + ]); + } + + /** + * Delete the server for the given ID. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TerminateInstances.html + * + * @param int $id + * + * @return bool + */ + public function delete(int $id): bool + { + try { + $this->client->terminateInstances(['InstanceIds' => [$id]]); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Rename the server for the given ID. + * + * @see @TODO + * + * @param int $id + * @param string $name + * + * @return bool + */ + public function rename(int $id, string $name): bool + { + // @TODO: Implement this + + return true; + } + + /** + * Start the server for the given ID.. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html + * + * @param int $id + * + * @return bool + */ + public function start(int $id): bool + { + try { + $this->client->startInstances(['InstanceIds' => [$id]]); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Stop the server for the given ID. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StopInstances.html + * + * @param int $id + * + * @return bool + */ + public function stop(int $id): bool + { + try { + $this->client->stopInstances(['InstanceIds' => [$id]]); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Reboot the server for the given ID. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RebootInstances.html + * + * @param int $id + * + * @return bool + */ + public function reboot(int $id): bool + { + try { + $this->client->rebootInstances(['InstanceIds' => [$id]]); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Get all available plans. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAvailabilityZones.html + * + * @throws UnknownProperties + */ + public function plans(): PlanCollection + { + $nextToken = null; + + $plans = []; + + do { + $response = $this->client->describeInstanceTypes(array_filter(['NextToken' => $nextToken])); + + $plans = array_merge($plans, $response->get('InstanceTypes')); + + $nextToken = $response->get('NextToken'); + } while ($nextToken); + + return new PlanCollection( + items: collect($plans) + ->transform(fn ($plan): Plan => new Plan([ + 'id' => $plan['InstanceType'], + 'disk' => (int) Arr::get($plan, 'InstanceStorageInfo.TotalSizeInGB') * 1024, + 'memory' => (int) Arr::get($plan, 'MemoryInfo.SizeInMiB'), + 'cores' => (int) Arr::get($plan, 'VCpuInfo.DefaultVCpus'), + 'regions' => [config('aws.region')], + ]))->toArray() + ); + } + + /** + * Get all available regions. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRegions.html + * + * @throws UnknownProperties + */ + public function regions(): RegionCollection + { + /** @var array> */ + $array = $this->client->describeRegions()->get('Regions'); + + $regions = collect($array)->where('OptInStatus', 'opt-in-not-required'); + + return new RegionCollection( + items: $regions->map(fn (array $region): Region => new Region([ + 'id' => $region['RegionName'], + 'name' => $region['Endpoint'], + ]))->toArray() + ); + } + + /** + * Get all available images. + * + * @see https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html + * + * @throws UnknownProperties + */ + public function images(): ImageCollection + { + // TODO : To implement + return new ImageCollection([]); + } + + /** + * Add an SSH key to the account. + * + * @see TBD + * + * @param string $name + * @param string $publicKey + * + * @return SecureShellKey + */ + public function createSecureShellKey(string $name, string $publicKey): SecureShellKey + { + /* @phpstan-ignore-next-line */ + return $this->client->request('post', '/account/keys', [ + 'name' => config('app.name'), + 'public_key' => $publicKey, + ])['ssh_key']['id']; + } + + /** + * Attempt to find an SSH key on the account. + * + * @see https://developers.digitalocean.com/documentation/v2/#list-all-keys + * + * @return SecureShellKey + */ + public function findSecureShellKey(string $publicKey): SecureShellKey + { + // @phpstan-ignore-next-line + $response = $this->client->request('get', '/account/keys'); + + // @phpstan-ignore-next-line + $response = collect($response)->first(fn ($key) => $key['public_key'] === trim($publicKey))['ssh_key']; + + return new SecureShellKey([ + 'id' => $response['id'], + 'name' => $response['name'], + ]); + } + + /** + * Remove an SSH key from the account. + * + * @see TBD + * + * @param string $id + * + * @return bool + */ + public function deleteSecureShellKey(string $id): bool + { + try { + /* @phpstan-ignore-next-line */ + $this->client->request('delete', "/account/keys/{$this->serverProvider->provider_key_id}"); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Get the image identifier. + * + * @return string + */ + public function getImageId(): string + { + return 'Ubuntu 18.04 x64'; + } + + /** + * Returns an instanciable Rule class for validate the server name. + * + * @return string + */ + public static function nameValidator(): string + { + return ValidAWSServerName::class; + } +} diff --git a/app/Domain/Server/Services/Providers/AWSExceptionHandler.php b/app/Domain/Server/Services/Providers/AWSExceptionHandler.php new file mode 100644 index 0000000..b4875d2 --- /dev/null +++ b/app/Domain/Server/Services/Providers/AWSExceptionHandler.php @@ -0,0 +1,25 @@ +exception; + } +} diff --git a/app/Domain/Server/Services/Providers/DigitalOcean.php b/app/Domain/Server/Services/Providers/DigitalOcean.php new file mode 100644 index 0000000..fd00008 --- /dev/null +++ b/app/Domain/Server/Services/Providers/DigitalOcean.php @@ -0,0 +1,392 @@ +request('get', 'account'); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Create a new server. + * + * @see https://developers.digitalocean.com/documentation/v2/#create-a-new-droplet + * + * @param ServerModel $serverToBeCreated + * + * @return Server + */ + public function create(ServerModel $serverToBeCreated): Server + { + $image = ServerProviderImage::where('uuid', $this->getImageId())->firstOrFail(); + + $server = $this->request('post', 'droplets', [ + 'name' => Str::slug($serverToBeCreated->name), + 'region' => $serverToBeCreated->region->uuid, + 'size' => $serverToBeCreated->plan->uuid, + 'image' => $image->uuid, + 'backups' => false, + 'ipv6' => false, + 'private_networking' => false, + 'monitoring' => false, + 'ssh_keys' => [$this->findSecureShellKey((string) $serverToBeCreated->serverProvider->provider_key_id)->id], + ])['droplet']; + + return $this->server($server['id']); + } + + /** + * Retrieve the server for the given ID. + * + * @see https://developers.digitalocean.com/documentation/v2/#retrieve-an-existing-droplet-by-id + * + * @param int $id + * + * @return Server + */ + public function server(int $id): Server + { + $server = $this->request('get', 'droplets/'.$id)['droplet']; + + /** @var array> */ + $response = Arr::get($server, 'networks.v4'); + + /** @var array */ + $network = collect($response)->firstWhere('type', 'public'); + + return new Server([ + 'id' => Arr::get($server, 'id'), + 'name' => Arr::get($server, 'name'), + 'plan' => Arr::get($server, 'size_slug'), + 'memory' => (int) Arr::get($server, 'memory'), + 'cores' => (int) Arr::get($server, 'vcpus'), + 'disk' => (int) Arr::get($server, 'disk'), + 'region' => Arr::get($server, 'region.slug'), + 'status' => Arr::get($server, 'status'), + 'remoteAddress' => Arr::get($network, 'ip_address'), + 'image' => Arr::get($server, 'image.slug'), + ]); + } + + /** + * Delete the server for the given ID. + * + * @see https://developers.digitalocean.com/documentation/v2/#delete-a-droplet + * + * @param int $id + * + * @return bool + */ + public function delete(int $id): bool + { + try { + $this->request('delete', 'droplets/'.$id); + } catch (ServerNotFound $exception) { + // Server was already deleted by the user. Nothing to do. + } + + return true; + } + + /** + * Rename the server for the given ID. + * + * @see https://developers.digitalocean.com/documentation/v2/#rename-a-droplet + * + * @param int $id + * @param string $name + * + * @return bool + */ + public function rename(int $id, string $name): bool + { + $this->request('post', 'droplets/'.$id.'/actions', [ + 'type' => 'rename', + 'name' => $name, + ]); + + return true; + } + + /** + * Start the server for the given ID. + * + * @see https://developers.digitalocean.com/documentation/v2/#power-on-a-droplet + * + * @param int $id + * + * @return bool + */ + public function start(int $id): bool + { + $this->request('post', 'droplets/'.$id.'/actions', ['type' => 'power_on']); + + return true; + } + + /** + * Stop the server for the given ID. + * + * @see https://developers.digitalocean.com/documentation/v2/#power-off-a-droplet + * + * @param int $id + * + * @return bool + */ + public function stop(int $id): bool + { + $this->request('post', 'droplets/'.$id.'/actions', ['type' => 'power_off']); + + return true; + } + + /** + * Reboot the server for the given ID. + * + * @see https://developers.digitalocean.com/documentation/v2/#reboot-a-droplet + * + * @param int $id + * + * @return bool + */ + public function reboot(int $id): bool + { + $this->request('post', 'droplets/'.$id.'/actions', ['type' => 'reboot']); + + return true; + } + + /** + * Get all available plans. + * + * @see https://developers.digitalocean.com/documentation/v2/#list-all-sizes + * + * @throws UnknownProperties + */ + public function plans(): PlanCollection + { + /** @var array> */ + $array = Arr::get($this->request('get', 'sizes'), 'sizes', []); + $plans = collect($array)->where('available', true); + + return new PlanCollection( + items: $plans->map(fn (array $plan): Plan => new Plan([ + 'id' => $plan['slug'], + 'disk' => (int) $plan['disk'], + 'memory' => (int) $plan['memory'], + 'cores' => (int) $plan['vcpus'], + 'regions' => $plan['regions'], + ]))->toArray() + ); + } + + /** + * Get all available regions. + * + * @see https://developers.digitalocean.com/documentation/v2/#list-all-regions + * + * @throws UnknownProperties + */ + public function regions(): RegionCollection + { + /** @var array> */ + $array = Arr::get($this->request('get', 'regions'), 'regions', []); + $regions = collect($array)->where('available', true); + + return new RegionCollection( + items: $regions->map(fn (array $region): Region => new Region([ + 'id' => $region['slug'], + 'name' => $region['name'], + ]))->toArray() + ); + } + + /** + * Get all available images. + * + * @see https://developers.digitalocean.com/documentation/v2/#images + * + * @throws UnknownProperties + */ + public function images(): ImageCollection + { + /** @var array> */ + $images = Arr::get($this->request('get', 'images', ['type' => 'distribution']), 'images', []); + + return new ImageCollection( + items: collect($images) + ->map(fn (array $image): Image => new Image([ + 'id' => $image['slug'] ?? $image['id'], + 'name' => $image['name'], + ]))->toArray() + ); + } + + /** + * Add an SSH key to the account. + * + * @see https://developers.digitalocean.com/documentation/v2/#create-a-new-key + * + * @param string $name + * @param string $publicKey + * + * @return SecureShellKey + */ + public function createSecureShellKey(string $name, string $publicKey): SecureShellKey + { + $response = $this->request('post', '/account/keys', [ + 'name' => $name, + 'public_key' => $publicKey, + ])['ssh_key']; + + return new SecureShellKey([ + 'id' => $response['id'], + 'publicKey' => $response['public_key'], + ]); + } + + /** + * Attempt to find an SSH key on the account. + * + * @see https://developers.digitalocean.com/documentation/v2/#list-all-keys + * + * @param string $id + * + * @return SecureShellKey + */ + public function findSecureShellKey(string $id): SecureShellKey + { + $response = $this->request('get', "/account/keys/{$id}")['ssh_key']; + + return new SecureShellKey([ + 'id' => $response['id'], + 'publicKey' => $response['public_key'], + ]); + } + + /** + * Remove an SSH key from the account. + * + * @see https://developers.digitalocean.com/documentation/v2/#destroy-a-key + * + * @param string $id + * + * @return bool + */ + public function deleteSecureShellKey(string $id): bool + { + $this->request('delete', "/account/keys/{$id}"); + + return true; + } + + /** + * Get the image identifier. + * + * @return string + */ + public function getImageId(): string + { + return 'ubuntu-18-04-x64'; + } + + /** + * Returns an instantiable Rule class for validate the server name. + * + * @return string + */ + public static function nameValidator(): string + { + return ValidDigitalOceanServerName::class; + } + + /** + * Make an HTTP request to DigitalOcean. + * + * @param string $method + * @param string $path + * @param array $parameters + * @throws ServerProviderError + * @throws \Domain\SecureShell\Exceptions\SecureShellKeyAlreadyInUse + * @throws \Domain\Server\Exceptions\ServerLimitExceeded + * @throws \Domain\Server\Exceptions\ServerNotFound + * @return array + */ + private function request(string $method, string $path, array $parameters = []): array + { + try { + $response = Http::withToken($this->token()) + ->withHeaders(['Content-Type' => 'application/json']) + ->send($method, 'https://api.digitalocean.com/v2/'.ltrim($path, '/'), $method === 'get' ? ['query' => $parameters] : ['json' => $parameters]); + + $response->throw(); + + if (in_array($response->status(), [201, 204], true) && $response->body() === '') { + return []; + } + + return $response->json(); + } catch (RequestException $exception) { + return DigitalOceanExceptionHandler::new($exception)->handle(); + } + } + + /** + * Get the authentication token for the provider. + * + * @return string + */ + private function token(): string + { + return $this->serverProvider->getMetaAttribute(ServerAttributeEnum::ACCESS_TOKEN); + } +} diff --git a/app/Domain/Server/Services/Providers/DigitalOceanExceptionHandler.php b/app/Domain/Server/Services/Providers/DigitalOceanExceptionHandler.php new file mode 100644 index 0000000..86b8bb5 --- /dev/null +++ b/app/Domain/Server/Services/Providers/DigitalOceanExceptionHandler.php @@ -0,0 +1,87 @@ +exception)) { + $this->handleAuthenticationErrors(); + $this->handleCreate(); + $this->handleServerLookup(); + $this->handleExceptionWithMessage(); + } + + /* @phpstan-ignore-next-line */ + throw $this->exception; + } + + private function handleAuthenticationErrors(): void + { + if ($this->exception instanceof RequestException && $this->exception->response->status() === 401) { + throw new ServerProviderAuthenticationException(); + } + } + + private function handleCreate(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'message'); + + if (Str::contains($error, 'exceed your droplet limit')) { + throw new ServerLimitExceeded(); + } + + if (Str::contains($error, 'SSH Key is already in use')) { + throw new SecureShellKeyAlreadyInUse(); + } + } + } + + private function handleServerLookup(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'message'); + + if (Str::contains($error, 'resource you were accessing could not be found')) { + throw new ServerNotFound(); + } + } + } + + private function handleExceptionWithMessage():void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'message'); + + if ($error !== null) { + throw new ServerProviderError($error); + } + + throw new ServerProviderError(); + } + } +} diff --git a/app/Domain/Server/Services/Providers/Hetzner.php b/app/Domain/Server/Services/Providers/Hetzner.php new file mode 100644 index 0000000..81f576e --- /dev/null +++ b/app/Domain/Server/Services/Providers/Hetzner.php @@ -0,0 +1,397 @@ +request('get', 'locations'); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Create a new server. + * + * @see https://docs.hetzner.cloud/#servers-create-a-server + * + * @param ServerModel $serverToBeCreated + * + * @return Server + */ + public function create(ServerModel $serverToBeCreated): Server + { + $image = ServerProviderImage::where('uuid', $this->getImageId())->firstOrFail(); + + $response = $this->request('post', 'servers', [ + 'name' => Str::slug($serverToBeCreated->name), + 'location' => $serverToBeCreated->region->uuid, + 'server_type' => $serverToBeCreated->plan->uuid, + 'image' => $image->uuid, + 'ssh_keys' => [$this->findSecureShellKey((string) $serverToBeCreated->serverProvider->provider_key_id)->id], + ])['server']; + + return $this->server($response['id']); + } + + /** + * Retrieve the server for the given ID. + * + * @see https://docs.hetzner.cloud/#servers-get-a-server + * + * @param int $id + * + * @return Server + */ + public function server(int $id): Server + { + $server = $this->request('get', 'servers/'.$id)['server']; + + return new Server([ + 'id' => Arr::get($server, 'id'), + 'name' => Arr::get($server, 'name'), + 'plan' => Arr::get($server, 'server_type.id'), + 'memory' => (int) Arr::get($server, 'server_type.memory') * 1024, + 'cores' => (int) Arr::get($server, 'server_type.cores'), + 'disk' => (int) Arr::get($server, 'server_type.disk'), + 'region' => Arr::get($server, 'datacenter.name'), + 'status' => Arr::get($server, 'status'), + 'remoteAddress' => Arr::get($server, 'public_net.ipv4.ip'), + 'image' => Arr::get($server, 'image.name'), + ]); + } + + /** + * Delete the server for the given ID. + * + * @see https://docs.hetzner.cloud/#servers-delete-a-server + * + * @param int $id + * + * @throws ClientException if request fails + * @throws ServerProviderError if response contains an error property + * + * @return bool + */ + public function delete(int $id): bool + { + try { + $response = $this->request('delete', 'servers/'.$id); + + HetznerExceptionHandler::newWithResponse($response)->handle(); + } catch (ServerNotFound $exception) { + // Server was already deleted by the user. Nothing to do. + } + + return true; + } + + /** + * Rename the server for the given ID. + * + * @see https://docs.hetzner.cloud/#servers-update-a-server + * + * @param int $id + * @param string $name + * + * @return bool + */ + public function rename(int $id, string $name): bool + { + $response = $this->request('put', 'servers/'.$id, [ + 'name' => $name, + ]); + + HetznerExceptionHandler::newWithResponse($response)->handle(); + + return true; + } + + /** + * Start the server for the given ID. + * + * @see https://docs.hetzner.cloud/#server-actions-power-on-a-server + * + * @param int $id + * + * @throws ClientException if request fails + * @throws ServerProviderError if response contains an error property + * + * @return bool + */ + public function start(int $id): bool + { + $response = $this->request('post', 'servers/'.$id.'/actions/poweron', ['body' => '{}']); + + HetznerExceptionHandler::newWithResponse($response)->handle(); + + return true; + } + + /** + * Stop the server for the given ID. + * + * @see https://docs.hetzner.cloud/#server-actions-power-off-a-server + * + * @param int $id + * + * @throws ClientException if request fails + * @throws ServerProviderError if response contains an error property + * + * @return bool + */ + public function stop(int $id): bool + { + $response = $this->request('post', 'servers/'.$id.'/actions/poweroff', ['body' => '{}']); + + HetznerExceptionHandler::newWithResponse($response)->handle(); + + return true; + } + + /** + * Reboot the server for the given ID. + * + * @see https://docs.hetzner.cloud/#server-actions-soft-reboot-a-server + * + * @param int $id + * + * @throws ClientException if request fails + * @throws ServerProviderError if response contains an error property + * + * @return bool + */ + public function reboot(int $id): bool + { + $response = $this->request('post', 'servers/'.$id.'/actions/reboot', ['body' => '{}']); + + HetznerExceptionHandler::newWithResponse($response)->handle(); + + return true; + } + + /** + * Get all available plans. + * + * @see https://docs.hetzner.cloud/#server-types-get-all-server-types + * + * @throws UnknownProperties + */ + public function plans(): PlanCollection + { + /** @var array>>> */ + $plans = Arr::get($this->request('get', 'server_types'), 'server_types', []); + + return new PlanCollection( + items: collect($plans) + ->map(fn (array $plan): Plan => new Plan([ + 'id' => $plan['name'], + 'disk' => (int) $plan['disk'], + 'memory' => (int) $plan['memory'] * 1024, + 'cores' => (int) $plan['cores'], + // @phpstan-ignore-next-line + 'regions' => collect($plan['prices'])->pluck('location')->toArray(), + ]))->toArray() + ); + } + + /** + * Get all available regions. + * + * @see https://docs.hetzner.cloud/#locations-get-all-locations + * + * @throws UnknownProperties + */ + public function regions(): RegionCollection + { + /** @var array> */ + $regions = Arr::get($this->request('get', 'locations'), 'locations', []); + + return new RegionCollection( + items: collect($regions) + ->map(fn ($region): Region => new Region([ + 'id' => $region['name'], + 'name' => $region['description'], + ]))->toArray() + ); + } + + /** + * Get all available images. + * + * @see https://docs.hetzner.cloud/#images-get-all-images + * + * @throws UnknownProperties + */ + public function images(): ImageCollection + { + /** @var array> */ + $images = Arr::get($this->request('get', 'images'), 'images', []); + + return new ImageCollection( + items: collect($images) + ->filter(fn ($image) => $image['name'] !== null) + ->map(fn ($image): Image => new Image([ + 'id' => $image['name'], + 'name' => $image['description'], + ]))->toArray() + ); + } + + /** + * Add an SSH key to the account. + * + * @see https://docs.hetzner.cloud/#ssh-keys-create-an-ssh-key + * + * @param string $name + * @param string $publicKey + * + * @return SecureShellKey + */ + public function createSecureShellKey(string $name, string $publicKey): SecureShellKey + { + $response = $this->request('post', '/ssh_keys', [ + 'name' => $name, + 'public_key' => $publicKey, + ])['ssh_key']; + + return new SecureShellKey([ + 'id' => $response['id'], + 'publicKey' => $response['public_key'], + ]); + } + + /** + * Attempt to find an SSH key on the account. + * + * @see https://docs.hetzner.cloud/#ssh-keys-get-all-ssh-keys + * + * @param string $id + * + * @return SecureShellKey + */ + public function findSecureShellKey(string $id): SecureShellKey + { + $response = $this->request('get', "/ssh_keys/{$id}")['ssh_key']; + + return new SecureShellKey([ + 'id' => $response['id'], + 'publicKey' => $response['public_key'], + ]); + } + + /** + * Remove an SSH key from the account. + * + * @see https://docs.hetzner.cloud/#ssh-keys-delete-an-ssh-key + * + * @param string $id + * + * @return bool + */ + public function deleteSecureShellKey(string $id): bool + { + $this->request('delete', "/ssh_keys/{$id}"); + + return true; + } + + /** + * Get the image identifier. + * + * @return string + */ + public function getImageId(): string + { + return 'ubuntu-18.04'; + } + + /** + * Returns an instantiable Rule class for validate the server name. + * + * @return string + */ + public static function nameValidator(): string + { + return ValidHetznerServerName::class; + } + + /** + * Make an HTTP request to Hetzner. + * + * @param string $method + * @param string $path + * @param array $parameters + */ + private function request(string $method, string $path, array $parameters = []): array + { + try { + $response = Http::withToken($this->token()) + ->send($method, 'https://api.hetzner.cloud/v1/'.ltrim($path, '/'), $method === 'get' ? ['query' => $parameters] : ['json' => $parameters]); + + $response->throw(); + + // Some API calls return a 204 No Content response. + return $response->json() ?? []; + } catch (RequestException $exception) { + return HetznerExceptionHandler::new($exception)->handle(); + } + } + + /** + * Get the authentication token for the provider. + * + * @return string + */ + private function token(): string + { + return $this->serverProvider->getMetaAttribute(ServerAttributeEnum::ACCESS_TOKEN); + } +} diff --git a/app/Domain/Server/Services/Providers/HetznerExceptionHandler.php b/app/Domain/Server/Services/Providers/HetznerExceptionHandler.php new file mode 100644 index 0000000..cf7a4a5 --- /dev/null +++ b/app/Domain/Server/Services/Providers/HetznerExceptionHandler.php @@ -0,0 +1,135 @@ +response !== null && count($this->response) > 0) { + $this->handleErrorStatus(); + } + + if (! is_null($this->exception)) { + $this->handleCreate(); + $this->handleCoreLimit(); + $this->handleServerLookup(); + $this->handleAuthentication(); + $this->handleSecureShellKeyConflict(); + $this->handleSecureShellKeyLimitReached(); + $this->handleExceptionWithMessage(); + + /* @phpstan-ignore-next-line */ + throw $this->exception; + } + + return null; + } + + private function handleErrorStatus(): void + { + if ($this->response !== null && Arr::get($this->response, 'action.status') === 'error') { + throw new ServerProviderError(); + } + } + + private function handleCreate(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'error.message'); + + if (Str::contains($error, 'server limit exceeded')) { + throw new ServerLimitExceeded(); + } + } + } + + private function handleAuthentication(): void + { + if ($this->exception instanceof RequestException && $this->exception->response->status() === 401) { + throw new ServerProviderAuthenticationException(); + } + } + + private function handleCoreLimit(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'error.message'); + + if (Str::contains($error, 'core limit exceeded')) { + throw new ServerCoreLimitExceeded(); + } + } + } + + private function handleServerLookup(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'error.code'); + + if (Str::contains($error, 'not_found')) { + throw new ServerNotFound(); + } + } + } + + private function handleSecureShellKeyConflict(): void + { + if ($this->exception instanceof RequestException) { + if ($this->exception->response->status() === 409) { + throw new ServerProviderSecureShellKeyUniqueness(); + } + } + } + + private function handleSecureShellKeyLimitReached(): void + { + if ($this->exception instanceof RequestException) { + if ($this->exception->response->status() === 403) { + throw new ServerProviderSecureShellKeyLimitReached(); + } + } + } + + private function handleExceptionWithMessage():void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'error.message'); + + if ($error !== null) { + throw new ServerProviderError($error); + } + + throw new ServerProviderError(); + } + } +} diff --git a/app/Domain/Server/Services/Providers/Linode.php b/app/Domain/Server/Services/Providers/Linode.php new file mode 100644 index 0000000..2d97e05 --- /dev/null +++ b/app/Domain/Server/Services/Providers/Linode.php @@ -0,0 +1,372 @@ +request('get', 'account'); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Create a new server. + * + * @see https://developers.linode.com/api/v4/linode-instances/#post + * + * @param ServerModel $serverToBeCreated + * + * @return Server + */ + public function create(ServerModel $serverToBeCreated): Server + { + $image = ServerProviderImage::where('uuid', $this->getImageId())->firstOrFail(); + + $response = $this->request('post', 'linode/instances', [ + 'label' => Str::slug($serverToBeCreated->name), + 'region' => $serverToBeCreated->region->uuid, + 'type' => $serverToBeCreated->plan->uuid, + 'image' => $image->uuid, + 'root_pass' => $serverToBeCreated->sudo_password, + 'authorized_keys' => [$this->findSecureShellKey((string) $serverToBeCreated->serverProvider->provider_key_id)->publicKey], + ]); + + return $this->server($response['id']); + } + + /** + * Retrieve the server for the given ID. + * + * @see https://developers.linode.com/api/v4/linode-instances-linode-id + * + * @param int $id + * + * @return Server + */ + public function server(int $id): Server + { + $server = $this->request('get', "linode/instances/{$id}"); + + return new Server([ + 'id' => Arr::get($server, 'id'), + 'name' => Arr::get($server, 'label'), + 'plan' => Arr::get($server, 'type'), + 'memory' => (int) Arr::get($server, 'specs.memory'), + 'cores' => (int) Arr::get($server, 'specs.vcpus'), + 'disk' => (int) Arr::get($server, 'specs.disk'), + 'region' => Arr::get($server, 'region'), + 'status' => Arr::get($server, 'status'), + 'remoteAddress' => Arr::get($server, 'ipv4.0'), + 'image' => Arr::get($server, 'image'), + ]); + } + + /** + * Delete the server for the given ID. + * + * @see https://developers.linode.com/api/v4/linode-instances-linode-id/#delete + * + * @param int $id + * + * @return bool + */ + public function delete(int $id): bool + { + $this->request('delete', 'linode/instances/'.$id); + + return true; + } + + /** + * Rename the server for the given ID. + * + * @see https://developers.linode.com/api/v4/linode-instances-linode-id/#put + * + * @param int $id + * @param string $name + * + * @return bool + */ + public function rename(int $id, string $name): bool + { + $this->request('put', 'linode/instances/'.$id, [ + 'label' => $name, + ]); + + return true; + } + + /** + * Start the server for the given ID. + * + * @see https://developers.linode.com/api/v4/linode-instances-linode-id-boot/#post + * + * @param int $id + * + * @return bool + */ + public function start(int $id): bool + { + $this->request('post', 'linode/instances/'.$id.'/boot'); + + return true; + } + + /** + * Stop the server for the given ID. + * + * @see https://developers.linode.com/api/v4/linode-instances-linode-id-shutdown/#post + * + * @param int $id + * + * @return bool + */ + public function stop(int $id): bool + { + $this->request('post', 'linode/instances/'.$id.'/shutdown'); + + return true; + } + + /** + * Reboot the server for the given ID. + * + * @see https://developers.linode.com/api/v4/linode-instances-linode-id-reboot/#post + * + * @param int $id + * + * @return bool + */ + public function reboot(int $id): bool + { + $this->request('post', 'linode/instances/'.$id.'/reboot'); + + return true; + } + + /** + * Get all available plans. + * + * @see https://developers.linode.com/api/v4/linode-types + * + * @throws UnknownProperties + */ + public function plans(): PlanCollection + { + /** @var array> */ + $plans = Arr::get($this->request('get', 'linode/types'), 'data', []); + + return new PlanCollection( + items: collect($plans) + ->map(fn ($plan): Plan => new Plan([ + 'id' => $plan['id'], + 'disk' => (int) $plan['disk'], + 'memory' => (int) $plan['memory'], + 'cores' => (int) $plan['vcpus'], + 'regions' => [], + ]))->toArray() + ); + } + + /** + * Get all available regions. + * + * @see https://developers.linode.com/api/v4/regions + * + * @throws UnknownProperties + */ + public function regions(): RegionCollection + { + /** @var array> */ + $regions = Arr::get($this->request('get', 'regions'), 'data', []); + + return new RegionCollection( + items: collect($regions) + ->map(fn ($region): Region => new Region([ + 'id' => $region['id'], + 'name' => $region['country'], + ]))->toArray() + ); + } + + /** + * Get all available images. + * + * @see https://developers.linode.com/api/v4/images + * + * @throws UnknownProperties + */ + public function images(): ImageCollection + { + /** @var array> */ + $images = Arr::get($this->request('get', 'images'), 'data', []); + + return new ImageCollection( + items: collect($images) + ->map(fn ($image): Image => new Image([ + 'id' => $image['id'], + 'name' => $image['label'], + ]))->toArray() + ); + } + + /** + * Add an SSH key to the account. + * + * @see https://developers.linode.com/api/v4/profile-sshkeys/#post + * + * @param string $name + * @param string $publicKey + * + * @return SecureShellKey + */ + public function createSecureShellKey(string $name, string $publicKey): SecureShellKey + { + $response = $this->request('post', '/profile/sshkeys', [ + 'label' => $name, + 'ssh_key' => trim($publicKey), + ]); + + return new SecureShellKey([ + 'id' => $response['id'], + 'publicKey' => $response['ssh_key'], + ]); + } + + /** + * Attempt to find an SSH key on the account. + * + * @see https://developers.linode.com/api/v4/profile-sshkeys-ssh-key-id + * + * @param string $id + * + * @return SecureShellKey + */ + public function findSecureShellKey(string $id): SecureShellKey + { + $response = $this->request('get', "/profile/sshkeys/{$id}"); + + return new SecureShellKey([ + 'id' => $response['id'], + 'publicKey' => $response['ssh_key'], + ]); + } + + /** + * Remove an SSH key from the account. + * + * @see https://developers.linode.com/api/v4/profile-sshkeys-ssh-key-id/#delete + * + * @param string $id + * + * @return bool + */ + public function deleteSecureShellKey(string $id): bool + { + $this->request('delete', "/profile/sshkeys/{$id}"); + + return true; + } + + /** + * Get the image identifier. + * + * @return string + */ + public function getImageId(): string + { + return 'linode/ubuntu18.04'; + } + + /** + * Returns an instantiable Rule class for validate the server name. + * + * @return string + */ + public static function nameValidator(): string + { + return ValidLinodeServerName::class; + } + + /** + * Make an HTTP request to Linode. + * + * @param string $method + * @param string $path + * @param array $parameters + * + * @return array + */ + private function request(string $method, string $path, array $parameters = []): array + { + try { + $response = Http::withToken($this->token()) + ->withHeaders(['Content-Type' => 'application/json']) + ->send($method, 'https://api.linode.com/v4/'.ltrim($path, '/'), $method === 'get' ? ['query' => $parameters] : ['json' => $parameters]); + + $response->throw(); + + return $response->json(); + } catch (RequestException $exception) { + return LinodeExceptionHandler::new($exception)->handle(); + } + } + + /** + * Get the authentication token for the provider. + * + * @return string + */ + private function token(): string + { + return $this->serverProvider->getMetaAttribute(ServerAttributeEnum::ACCESS_TOKEN); + } +} diff --git a/app/Domain/Server/Services/Providers/LinodeExceptionHandler.php b/app/Domain/Server/Services/Providers/LinodeExceptionHandler.php new file mode 100644 index 0000000..69e3e50 --- /dev/null +++ b/app/Domain/Server/Services/Providers/LinodeExceptionHandler.php @@ -0,0 +1,55 @@ +handleCreate(); + $this->handleServerLookup(); + + throw $this->exception; + } + + private function handleCreate(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'errors.0.reason'); + + if (Str::contains($error, 'Account Limit reached')) { + throw new ServerLimitExceeded(); + } + } + } + + private function handleServerLookup(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'errors.0.reason'); + + if (Str::contains($error, 'Not found')) { + throw new ServerNotFound(); + } + } + } +} diff --git a/app/Domain/Server/Services/Providers/Vultr.php b/app/Domain/Server/Services/Providers/Vultr.php new file mode 100644 index 0000000..20481a2 --- /dev/null +++ b/app/Domain/Server/Services/Providers/Vultr.php @@ -0,0 +1,375 @@ +request('get', 'auth/info'); + + return true; + } catch (Throwable) { + return false; + } + } + + /** + * Create a new server. + * + * @see https://www.vultr.com/api/#server_create + * + * @param ServerModel $serverToBeCreated + * + * @return Server + */ + public function create(ServerModel $serverToBeCreated): Server + { + $image = ServerProviderImage::where('uuid', $this->getImageId())->firstOrFail(); + + $response = $this->request('post', 'server/create', [ + 'label' => Str::slug($serverToBeCreated->name), + 'DCID' => $serverToBeCreated->region->uuid, + 'VPSPLANID' => $serverToBeCreated->plan->uuid, + 'OSID' => $image->uuid, + 'SSHKEYID' => $this->findSecureShellKey((string) $serverToBeCreated->serverProvider->provider_key_id)->id, + ]); + + return $this->server((int) $response['SUBID']); + } + + /** + * Retrieve the server for the given ID. + * + * @see https://www.vultr.com/api/#server_server_list + * + * @param int $id + * + * @return Server + */ + public function server(int $id): Server + { + $serverList = $this->request('get', 'server/list'); + + if (! array_key_exists($id, $serverList)) { + throw new ServerNotFound(); + } + + $server = $serverList[$id]; + + $remoteAddress = Arr::get($server, 'main_ip'); + + return new Server([ + 'id' => Arr::get($server, 'SUBID'), + 'name' => Arr::get($server, 'label'), + 'plan' => Arr::get($server, 'VPSPLANID'), + 'memory' => (int) filter_var(Arr::get($server, 'ram'), FILTER_SANITIZE_NUMBER_INT), + 'cores' => (int) filter_var(Arr::get($server, 'vcpu_count'), FILTER_SANITIZE_NUMBER_INT), + 'disk' => (int) filter_var(Arr::get($server, 'disk'), FILTER_SANITIZE_NUMBER_INT), + 'region' => Arr::get($server, 'location'), + 'status' => Arr::get($server, 'status'), + 'remoteAddress' => $remoteAddress === '0.0.0.0' ? null : $remoteAddress, + 'image' => Arr::get($server, 'os'), + ]); + } + + /** + * Delete the server for the given ID. + * + * @see https://www.vultr.com/api/#server_destroy + * + * @param int $id + * + * @return bool + */ + public function delete(int $id): bool + { + $this->request('post', 'server/destroy', ['SUBID' => $id]); + + return true; + } + + /** + * Rename the server for the given ID. + * + * @see https://www.vultr.com/api/#server_label_set + * + * @param int $id + * @param string $name + * + * @return bool + */ + public function rename(int $id, string $name): bool + { + $this->request('post', 'server/label_set', [ + 'SUBID' => $id, + 'label' => $name, + ]); + + return true; + } + + /** + * Start the server for the given ID. + * + * @see https://www.vultr.com/api/#server_start + * + * @param int $id + * + * @return bool + */ + public function start(int $id): bool + { + $this->request('post', 'server/start', ['SUBID' => $id]); + + return true; + } + + /** + * Stop the server for the given ID. + * + * @see https://www.vultr.com/api/#server_halt + * + * @param int $id + * + * @return bool + */ + public function stop(int $id): bool + { + $this->request('post', 'server/halt', ['SUBID' => $id]); + + return true; + } + + /** + * Reboot the server for the given ID. + * + * @see https://www.vultr.com/api/#server_reboot + * + * @param int $id + * + * @return bool + */ + public function reboot(int $id): bool + { + $this->request('post', 'server/reboot', ['SUBID' => $id]); + + return true; + } + + /** + * Get all available plans. + * + * @see https://www.vultr.com/api/#plans_plan_list + * + * @throws UnknownProperties + */ + public function plans(): PlanCollection + { + $plans = $this->request('get', 'plans/list'); + + return new PlanCollection( + items: collect($plans) + ->transform(fn ($plan): Plan => new Plan([ + 'id' => $plan['VPSPLANID'], + 'disk' => (int) $plan['disk'], + 'memory' => (int) $plan['ram'], + 'cores' => (int) $plan['vcpu_count'], + 'regions' => $plan['available_locations'], + ]))->toArray() + ); + } + + /** + * Get all available regions. + * + * @see https://www.vultr.com/api/#regions_region_list + * + * @throws UnknownProperties + */ + public function regions(): RegionCollection + { + $regions = $this->request('get', 'regions/list'); + + return new RegionCollection( + items: collect($regions) + ->transform(fn ($region): Region => new Region([ + 'id' => $region['DCID'], + 'name' => $region['name'], + ]))->toArray() + ); + } + + /** + * Get all available images. + * + * @see https://www.vultr.com/api/#os_os_list + * + * @throws UnknownProperties + */ + public function images(): ImageCollection + { + $images = $this->request('get', 'os/list'); + + return new ImageCollection( + items: collect($images) + ->transform(fn ($image): Image => new Image([ + 'id' => $image['OSID'], + 'name' => $image['name'], + ]))->toArray() + ); + } + + /** + * Add an SSH key to the account. + * + * @see https://www.vultr.com/api/#sshkey_create + * + * @param string $name + * @param string $publicKey + * + * @return SecureShellKey + */ + public function createSecureShellKey(string $name, string $publicKey): SecureShellKey + { + $response = $this->request('post', '/sshkey/create', [ + 'name' => $name, + 'ssh_key' => $publicKey, + ]); + + return new SecureShellKey([ + 'id' => $response['SSHKEYID'], + 'publicKey' => null, + ]); + } + + /** + * Attempt to find an SSH key on the account. + * + * @see https://www.vultr.com/api/#sshkey_sshkey_list + * + * @param string $id + * + * @return SecureShellKey + */ + public function findSecureShellKey(string $id): SecureShellKey + { + $response = $this->request('get', '/sshkey/list'); + $response = collect(array_values($response))->first(fn ($key) => $key['SSHKEYID'] === trim($id)); + + return new SecureShellKey([ + 'id' => $response['SSHKEYID'], + 'publicKey' => $response['ssh_key'], + ]); + } + + /** + * Remove an SSH key from the account. + * + * @see https://www.vultr.com/api/#sshkey_destroy + * + * @param string $id + * + * @return bool + */ + public function deleteSecureShellKey(string $id): bool + { + $this->request('post', '/sshkey/destroy', ['SSHKEYID' => $id]); + + return true; + } + + /** + * Get the image identifier. + * + * @return string + */ + public function getImageId(): string + { + return '270'; //'Ubuntu 18.04 x64'; + } + + /** + * Make an HTTP request to Vultr. + * + * @param string $method + * @param string $path + * @param array $parameters + * + * @return array + */ + public function request(string $method, string $path, array $parameters = []): array + { + try { + $response = Http::withHeaders(['API-Key' => $this->token()]) + ->send($method, 'https://api.vultr.com/v1/'.ltrim($path, '/'), ['form_params' => $parameters]); + + $response->throw(); + + return $response->json(); + } catch (RequestException $exception) { + return VultrExceptionHandler::new($exception)->handle(); + } + } + + /** + * Returns an instantiable Rule class for validate the server name. + * + * @return string + */ + public static function nameValidator(): string + { + return ValidVultrServerName::class; + } + + /** + * Get the authentication token for the provider. + * + * @return string + */ + private function token(): string + { + return $this->serverProvider->getMetaAttribute(ServerAttributeEnum::ACCESS_TOKEN); + } +} diff --git a/app/Domain/Server/Services/Providers/VultrExceptionHandler.php b/app/Domain/Server/Services/Providers/VultrExceptionHandler.php new file mode 100644 index 0000000..2c5524b --- /dev/null +++ b/app/Domain/Server/Services/Providers/VultrExceptionHandler.php @@ -0,0 +1,42 @@ +handleCreate(); + + throw $this->exception; + } + + private function handleCreate(): void + { + if ($this->exception instanceof RequestException) { + $error = Arr::get(json_decode($this->exception->response->body(), true), 'reasonPhrase'); + + if (Str::is($error, 'You have reached the maximum monthly fee limit for this account.')) { + throw new ServerLimitExceeded(); + } + } + } +} diff --git a/app/Domain/Server/Services/ServerProviderClientFactory.php b/app/Domain/Server/Services/ServerProviderClientFactory.php new file mode 100644 index 0000000..56fe62c --- /dev/null +++ b/app/Domain/Server/Services/ServerProviderClientFactory.php @@ -0,0 +1,30 @@ +type) { + ServerProviderTypeEnum::DIGITALOCEAN => new DigitalOcean($serverProvider), + ServerProviderTypeEnum::HETZNER => new Hetzner($serverProvider), + ServerProviderTypeEnum::AWS => new AWS($serverProvider), + ServerProviderTypeEnum::VULTR => new Vultr($serverProvider), + ServerProviderTypeEnum::LINODE => new Linode($serverProvider), + default => throw new InvalidArgumentException(trans('exceptions.invalid_server_provider_type')), + }; + } +} diff --git a/app/Domain/Server/Support/Rules/ValidAWSServerName.php b/app/Domain/Server/Support/Rules/ValidAWSServerName.php new file mode 100644 index 0000000..45a80bc --- /dev/null +++ b/app/Domain/Server/Support/Rules/ValidAWSServerName.php @@ -0,0 +1,35 @@ +properties['user_id']; + } +} diff --git a/app/Domain/Status/Models/Status.php b/app/Domain/Status/Models/Status.php new file mode 100644 index 0000000..701daf8 --- /dev/null +++ b/app/Domain/Status/Models/Status.php @@ -0,0 +1,12 @@ +network; + } + + public function description() : string + { + return ActivityDescriptionEnum::CREATED; + } + + public function causer() : ?Model + { + return $this->network->token; + } + + public function payload() : array + { + return []; + } +} diff --git a/app/Domain/Token/Events/ServerCreated.php b/app/Domain/Token/Events/ServerCreated.php new file mode 100644 index 0000000..a7077fb --- /dev/null +++ b/app/Domain/Token/Events/ServerCreated.php @@ -0,0 +1,44 @@ +server; + } + + public function description() : string + { + return ActivityDescriptionEnum::CREATED; + } + + public function causer() : ?Model + { + return $this->server->token; + } + + public function payload() : array + { + return [ + 'preset' => $this->server->preset, + 'path' => $this->server->pathShow(), + ]; + } +} diff --git a/app/Domain/Token/Events/ServerDeleted.php b/app/Domain/Token/Events/ServerDeleted.php new file mode 100644 index 0000000..a54fce4 --- /dev/null +++ b/app/Domain/Token/Events/ServerDeleted.php @@ -0,0 +1,52 @@ +server = $server; + $this->serverProviderClient = $this->server->serverProvider->client(); + $this->providerServerId = $this->server->provider_server_id; + } + + public function subject() : Model + { + return $this->server; + } + + public function description() : string + { + return ActivityDescriptionEnum::DELETED; + } + + public function causer() : ?Model + { + return $this->server->token; + } + + public function payload() : array + { + return [ + 'preset' => $this->server->preset, + ]; + } +} diff --git a/app/Domain/Token/Events/ServerProviderCreated.php b/app/Domain/Token/Events/ServerProviderCreated.php new file mode 100644 index 0000000..c73bb78 --- /dev/null +++ b/app/Domain/Token/Events/ServerProviderCreated.php @@ -0,0 +1,43 @@ +provider; + } + + public function description() : string + { + return ActivityDescriptionEnum::CREATED; + } + + public function causer() : ?Model + { + return $this->provider->token; + } + + public function payload() : array + { + return [ + 'type' => $this->provider->type, + ]; + } +} diff --git a/app/Domain/Token/Events/ServerProviderDeleted.php b/app/Domain/Token/Events/ServerProviderDeleted.php new file mode 100644 index 0000000..a3b8bb1 --- /dev/null +++ b/app/Domain/Token/Events/ServerProviderDeleted.php @@ -0,0 +1,43 @@ +serverProvider; + } + + public function description() : string + { + return ActivityDescriptionEnum::DELETED; + } + + public function causer() : ?Model + { + return $this->serverProvider->token; + } + + public function payload() : array + { + return [ + 'type' => $this->serverProvider->type, + ]; + } +} diff --git a/app/Domain/Token/Events/ServerProviderUpdated.php b/app/Domain/Token/Events/ServerProviderUpdated.php new file mode 100644 index 0000000..c233f34 --- /dev/null +++ b/app/Domain/Token/Events/ServerProviderUpdated.php @@ -0,0 +1,17 @@ +token; + } + + public function description() : string + { + return ActivityDescriptionEnum::CREATED; + } + + public function causer() : ?Model + { + return $this->token; + } + + public function payload() : array + { + return []; + } +} diff --git a/app/Domain/Token/Events/TokenDeleted.php b/app/Domain/Token/Events/TokenDeleted.php new file mode 100644 index 0000000..38a98fa --- /dev/null +++ b/app/Domain/Token/Events/TokenDeleted.php @@ -0,0 +1,42 @@ +token; + } + + public function description() : string + { + return ActivityDescriptionEnum::DELETED; + } + + public function causer() : ?Model + { + return $this->token; + } + + public function payload() : array + { + return []; + } +} diff --git a/app/Domain/Token/Listeners/ServerCreated/CreateServerOnProvider.php b/app/Domain/Token/Listeners/ServerCreated/CreateServerOnProvider.php new file mode 100644 index 0000000..2055860 --- /dev/null +++ b/app/Domain/Token/Listeners/ServerCreated/CreateServerOnProvider.php @@ -0,0 +1,25 @@ +server; + + CreateServerOnProviderJob::dispatch($server); + } +} diff --git a/app/Domain/Token/Listeners/ServerDeleted/DestroyServerOnServerProvider.php b/app/Domain/Token/Listeners/ServerDeleted/DestroyServerOnServerProvider.php new file mode 100644 index 0000000..a00ad6b --- /dev/null +++ b/app/Domain/Token/Listeners/ServerDeleted/DestroyServerOnServerProvider.php @@ -0,0 +1,28 @@ +providerServerId)) { + return; + } + + DestroyServerOnServerProviderJob::dispatch($event->server, $event->serverProviderClient, $event->providerServerId); + } +} diff --git a/app/Domain/Token/Listeners/ServerDeleted/NotifyUsersOfServerDeletion.php b/app/Domain/Token/Listeners/ServerDeleted/NotifyUsersOfServerDeletion.php new file mode 100644 index 0000000..ae7f6b7 --- /dev/null +++ b/app/Domain/Token/Listeners/ServerDeleted/NotifyUsersOfServerDeletion.php @@ -0,0 +1,36 @@ +notifiables($event->server) + ->each + ->notify(new ServerDeletedNotification($event->server)); + } + + /** + * @param Server $server + * @return Collection + */ + private function notifiables(Server $server) : Collection + { + /** @var Token $token */ + $token = $server->token()->withTrashed()->first(); + + return $server->isProvisioned() ? $token->collaborators : collect([ + $token->user, $server->creator(), + ])->filter()->unique('id')->values(); + } +} diff --git a/app/Domain/Token/Listeners/ServerProviderDeleted/ForgetServerProviderTokenConfiguration.php b/app/Domain/Token/Listeners/ServerProviderDeleted/ForgetServerProviderTokenConfiguration.php new file mode 100644 index 0000000..8eb5dc3 --- /dev/null +++ b/app/Domain/Token/Listeners/ServerProviderDeleted/ForgetServerProviderTokenConfiguration.php @@ -0,0 +1,33 @@ +serverProvider; + + $this->getRelatedTokens($serverProvider)->each->forgetServerConfiguration(); + } + + private function getRelatedTokens(ServerProvider $serverProvider): Collection + { + return Token::where('extra_attributes->'.ServerAttributeEnum::SERVER_CONFIG.'->server_provider_id', $serverProvider->id)->get(); + } +} diff --git a/app/Domain/Token/Listeners/ServerProviderDeleted/TriggerSecureShellKeyRemovalFromServerProvider.php b/app/Domain/Token/Listeners/ServerProviderDeleted/TriggerSecureShellKeyRemovalFromServerProvider.php new file mode 100644 index 0000000..d6f80b0 --- /dev/null +++ b/app/Domain/Token/Listeners/ServerProviderDeleted/TriggerSecureShellKeyRemovalFromServerProvider.php @@ -0,0 +1,23 @@ +serverProvider); + } +} diff --git a/app/Domain/Token/Listeners/ServerProviderUpdated/IndexServerProviderRelatedData.php b/app/Domain/Token/Listeners/ServerProviderUpdated/IndexServerProviderRelatedData.php new file mode 100644 index 0000000..d6c3f1e --- /dev/null +++ b/app/Domain/Token/Listeners/ServerProviderUpdated/IndexServerProviderRelatedData.php @@ -0,0 +1,33 @@ +serverProvider; + + if (! is_null($serverProvider->provider_key_id)) { + IndexServerProviderPlans::dispatch($serverProvider); + + IndexServerProviderRegions::dispatch($serverProvider); + + IndexServerProviderImages::dispatch($serverProvider); + } + } +} diff --git a/app/Domain/Token/Listeners/ServerUpdating/UpdateServerProviderName.php b/app/Domain/Token/Listeners/ServerUpdating/UpdateServerProviderName.php new file mode 100644 index 0000000..2dfb19b --- /dev/null +++ b/app/Domain/Token/Listeners/ServerUpdating/UpdateServerProviderName.php @@ -0,0 +1,49 @@ +server; + + if ($server->provider_server_id !== null && $server->isDirty('name')) { + try { + $server->serverProvider->client()->rename( + $server->provider_server_id, + $server->name, + ); + } catch (Throwable $e) { + if ($e instanceof ServerProviderAuthenticationException) { + $this->notifiables($event)->each->notify(new ServerProviderAuthenticationFailed($server->serverProvider)); + } + + throw $e; + } + } + } + + private function notifiables(ServerUpdating $event) : Collection + { + return collect([ + $event->server->serverProvider->user(), + $event->server->token->user, + ])->filter()->unique('id')->values(); + } +} diff --git a/app/Domain/Token/Listeners/TokenCreated/CreateDefaultNetworks.php b/app/Domain/Token/Listeners/TokenCreated/CreateDefaultNetworks.php new file mode 100644 index 0000000..5d13e94 --- /dev/null +++ b/app/Domain/Token/Listeners/TokenCreated/CreateDefaultNetworks.php @@ -0,0 +1,27 @@ +token->networks()->createMany($this->networks()); + } + + /** + * @return array> + */ + private function networks() : array + { + return collect(static::DEFAULT_NETWORKS)->map(fn (string $network) => [ + 'name' => $network, + ])->toArray(); + } +} diff --git a/app/Domain/Token/Listeners/TokenDeleted/NotifyCollaborators.php b/app/Domain/Token/Listeners/TokenDeleted/NotifyCollaborators.php new file mode 100644 index 0000000..a9413c4 --- /dev/null +++ b/app/Domain/Token/Listeners/TokenDeleted/NotifyCollaborators.php @@ -0,0 +1,23 @@ +token->refresh(); + + if ($event->token->exists) { + $event->token + ->collaborators + ->each + ->notify(new TokenDeletedNotification($event->token)); + } + } +} diff --git a/app/Domain/Token/Listeners/TokenDeleted/PurgeTokenResources.php b/app/Domain/Token/Listeners/TokenDeleted/PurgeTokenResources.php new file mode 100644 index 0000000..2065a3e --- /dev/null +++ b/app/Domain/Token/Listeners/TokenDeleted/PurgeTokenResources.php @@ -0,0 +1,19 @@ +token->purge($event->shouldDeleteServers); + } +} diff --git a/app/Domain/Token/Listeners/TokenDeleted/RemoveTokenNotifications.php b/app/Domain/Token/Listeners/TokenDeleted/RemoveTokenNotifications.php new file mode 100644 index 0000000..4937ba9 --- /dev/null +++ b/app/Domain/Token/Listeners/TokenDeleted/RemoveTokenNotifications.php @@ -0,0 +1,16 @@ +token->id)->delete(); + } +} diff --git a/app/Domain/Token/Models/Network.php b/app/Domain/Token/Models/Network.php new file mode 100644 index 0000000..a078192 --- /dev/null +++ b/app/Domain/Token/Models/Network.php @@ -0,0 +1,99 @@ + NetworkCreated::class, + ]; + + public function token(): BelongsTo + { + return $this->belongsTo(Token::class); + } + + public function servers(): HasMany + { + return $this->hasMany(Server::class); + } + + public function scopeName(Builder $query, string $network): Builder|EloquentModel|null + { + return $query->where('name', $network)->first(); + } + + public function hasGenesis(): bool + { + return $this->servers()->where('preset', 'genesis')->count() > 0; + } + + public function epoch() : ?string + { + return $this->created_at?->toISOString(); + } + + /** + * @throws Exception + */ + public function base58Prefix() : ?int + { + return AddressPrefixes::get(match ($this->name) { + NetworkTypeEnum::MAINNET => $this->token->config['mainnetPrefix'] ?? null, + NetworkTypeEnum::DEVNET => $this->token->config['devnetPrefix'] ?? null, + NetworkTypeEnum::TESTNET => $this->token->config['testnetPrefix'] ?? null, + default => throw new Exception('Unknown NetworkType'), + }); + } + + public function hasProvisionedGenesis(): bool + { + if ($this->hasGenesis()) { + return $this->servers()->where('preset', 'genesis')->first()?->isProvisioned() ?? false; + } + + return false; + } + + public function getGenesis(): Server + { + return $this->servers()->where('preset', 'genesis')->firstOrFail(); + } + + // We use those methods to get faster and more consistent access to commonly used nested URLs. + public function pathShow(): string + { + return route('tokens.show', [$this->token, $this]); + } + + public function configurationPath() : string + { + return hash('sha256', $this->id.$this->name).'.zip'; + } +} diff --git a/app/Domain/Token/Models/Token.php b/app/Domain/Token/Models/Token.php new file mode 100644 index 0000000..b7b6d6e --- /dev/null +++ b/app/Domain/Token/Models/Token.php @@ -0,0 +1,324 @@ + 'array', + 'keypair' => 'array', + 'extra_attributes' => 'array', + 'onboarded_at' => 'datetime', + ]; + + protected $with = ['media']; + + protected $withCount = ['servers', 'serverProviders', 'secureShellKeys']; + + public function purge(bool $removeServersFromProvider = true) : void + { + $this->invitations()->delete(); + $this->statuses()->delete(); + + if ($removeServersFromProvider) { + $this->servers->each->delete(); + } else { + // By not dispatching model events, jobs that delete servers from server provider will not fire... + Server::withoutEvents(function () { + $this->servers->each->delete(); + }); + } + + $this->networks()->delete(); + $this->serverProviders()->delete(); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function coin(): BelongsTo + { + return $this->belongsTo(Coin::class); + } + + public function serverProviders(): HasMany + { + return $this->hasMany(ServerProvider::class); + } + + public function networks(): HasMany + { + return $this->hasMany(Network::class); + } + + public function servers(): HasManyThrough + { + return $this->hasManyThrough(Server::class, Network::class); + } + + public function network(string $name): ?Network + { + return $this->networks()->where('name', $name)->first(); + } + + public function invitations(): HasMany + { + return $this->hasMany(Invitation::class); + } + + public function collaborators(): BelongsToMany + { + return $this + ->belongsToMany(User::class, 'token_users', 'token_id', 'user_id') + ->using(Collaborator::class) + ->withPivot(['role', 'permissions', 'created_at']); + } + + public function hasCollaborator(User $user) : bool + { + return $this->collaborators->contains($user) || $user->is($this->user); + } + + public function secureShellKeys(): BelongsToMany + { + return $this->belongsToMany(SecureShellKey::class); + } + + public function getSlugOptions(): SlugOptions + { + return SlugOptions::create() + ->generateSlugsFrom('name') + ->saveSlugsTo('slug') + ->slugsShouldBeNoLongerThan(250); // 255 but room for suffix + } + + public function canBeEdited(): bool + { + return $this->servers_count === 0; + } + + public function shareWith(User $user, string $role = 'collaborator', array $permissions = []): void + { + $this->collaborators()->detach($user); + + $this->collaborators()->attach($user, [ + 'role' => $role, + 'permissions' => $permissions, + ]); + + unset($this->collaborators); + } + + public function stopSharingWith(User $user): void + { + $this->collaborators()->detach($user); + + unset($this->collaborators); + } + + public function getLogoAttribute(): string + { + return Cache::rememberForever( + "tokens.{$this->id}.logo", + fn () => $this->getFirstMediaUrl('logo') + ); + } + + public function registerMediaCollections(): void + { + $this->addMediaCollection('logo')->singleFile(); + } + + public function hasSecureShellKeys(): bool + { + return $this->secure_shell_keys_count > 0; + } + + public function hasServerProviders(): bool + { + return $this->server_providers_count > 0; + } + + public function needsServerConfiguration(): bool + { + return $this->servers_count === 0 && ! $this->hasServerConfiguration(); + } + + public function hasServers(): bool + { + return $this->servers_count > 0; + } + + public function hasProvisionedGenesisServer(): bool + { + return Cache::rememberForever("tokens.{$this->id}.hasProvisionedGenesisServer", function (): bool { + return $this + ->servers() + ->where('preset', PresetTypeEnum::GENESIS) + ->whereNotNull('provisioned_at') + ->whereHas('statuses', fn (Builder $query) => $query->where('name', ServerDeploymentStatus::PROVISIONED)) + ->count() > 0; + }); + } + + public function onboarding(): OnboardingManager + { + return new OnboardingManager($this); + } + + public function setKeypair(array $keypair): void + { + $keypair['privateKey'] = encrypt($keypair['privateKey']); + $this->keypair = $keypair; + $this->save(); + } + + public function getPrivateKey(): string + { + return decrypt($this->keypair['privateKey'] ?? null); + } + + public function availableKeys(): Collection + { + return $this->collaborators + ->map(fn ($collaborator) => $collaborator->secureShellKeys) + ->flatten(); + } + + public function hasAuthorizedKeys(): bool + { + return $this + ->collaborators + ->map(fn ($collaborator) => $collaborator->secureShellKeys->pluck('public_key')) + ->flatten() + ->count() > 0; + } + + public function allows(User $user, string $ability): bool + { + if ($user->ownsToken($this)) { + return true; + } + + try { + $collaborator = $this->collaborators()->where('user_id', $user->id)->firstOrFail(); + + return count(array_intersect($collaborator->pivot->permissions ?? [], ['*', $ability])) > 0; + } catch (Throwable) { + return false; + } + } + + public function getFirstIndexedServerProvider(): ?ServerProvider + { + return $this->serverProviders->filter->allIndexed()->first(); + } + + public function hasAnyIndexedServerProvider(): bool + { + return $this->serverProviders->filter->allIndexed()->count() > 0; + } + + public function getNormalizedTokenAttribute(): string + { + return strtolower($this->config['token'] ?? null); + } + + public function flushCache(): void + { + Cache::forget("tokens.{$this->id}.logo"); + Cache::forget("tokens.{$this->id}.hasProvisionedGenesisServer"); + } + + public function logo() : ?Media + { + return $this->getFirstMedia('logo'); + } + + public function fallbackIdentifier() : ?string + { + return $this->name; + } + + public function hasServerConfiguration(): bool + { + return Arr::get($this->getMetaAttribute(TokenAttributeEnum::SERVER_CONFIG), 'server_provider_id') !== null; + } + + public function forgetServerConfiguration(): void + { + $this->forgetMetaAttribute(TokenAttributeEnum::SERVER_CONFIG); + } + + /** + * Perform any actions required after the model boots. + * + * @return void + */ + protected static function booted() + { + static::created(function (self $token) { + $token->shareWith($token->user, 'owner'); + + $token->setStatus(TokenStatusEnum::PENDING); + }); + } +} diff --git a/app/Domain/Token/Policies/TokenPolicy.php b/app/Domain/Token/Policies/TokenPolicy.php new file mode 100644 index 0000000..2fff036 --- /dev/null +++ b/app/Domain/Token/Policies/TokenPolicy.php @@ -0,0 +1,49 @@ +onToken($token); + } + + public function view(User $user, Token $token): bool + { + return $user->onToken($token); + } + + public function update(User $user, Token $token): bool + { + return $token->allows($user, 'token:update'); + } + + public function delete(User $user, Token $token): bool + { + return $token->allows($user, 'token:delete'); + } + + public function createCollaborator(User $user, Token $token): bool + { + return $token->allows($user, 'collaborator:create'); + } + + public function deleteCollaborator(User $user, Token $token): bool + { + return $token->allows($user, 'collaborator:delete'); + } + + public function manageKeys(User $user, Token $token): bool + { + return $token->allows($user, 'ssh-key:manage'); + } +} diff --git a/app/Domain/Token/Rules/ReservedTokenName.php b/app/Domain/Token/Rules/ReservedTokenName.php new file mode 100644 index 0000000..81412c7 --- /dev/null +++ b/app/Domain/Token/Rules/ReservedTokenName.php @@ -0,0 +1,33 @@ +blacklist = (array) trans('tokens_blacklist'); + } + + public function passes($attribute, $value) + { + return ! collect($this->blacklist) + ->containsStrict($this->normalizeValue($value)); + } + + public function message() + { + return trans('validation.custom.blacklisted'); + } + + private function normalizeValue(string $value): string + { + return (string) Str::of($value)->ascii()->lower(); + } +} diff --git a/app/Domain/Token/Rules/UniqueTokenExtraAttribute.php b/app/Domain/Token/Rules/UniqueTokenExtraAttribute.php new file mode 100644 index 0000000..8be4ed0 --- /dev/null +++ b/app/Domain/Token/Rules/UniqueTokenExtraAttribute.php @@ -0,0 +1,35 @@ +token->serverProviders as $provider) { + if ($provider->getMetaAttribute($attribute) === null || $provider->getMetaAttribute($attribute) === '') { + continue; + } + + if ($provider->getMetaAttribute($attribute) === $value) { + return false; + } + } + + return true; + } + + public function message() + { + return trans('validation.messages.unique_token_extra_attribute'); + } +} diff --git a/app/Domain/User/Models/DatabaseNotification.php b/app/Domain/User/Models/DatabaseNotification.php new file mode 100644 index 0000000..0c3c569 --- /dev/null +++ b/app/Domain/User/Models/DatabaseNotification.php @@ -0,0 +1,67 @@ +id; + $userId = Auth::id(); + $tokenId = $this->data['token']; + + return Cache::remember( + md5("notifications.{$notificationId}.{$userId}.{$tokenId}"), + 300, // 300 seconds + fn () => Token::withTrashed()->findOrFail($tokenId) + ); + } + + public function name(): string + { + return $this->token->name; + } + + public function title(): string + { + return $this->token->name; + } + + public function logo(): string + { + return $this->token->logo; + } + + public function route() : ?string + { + if ($this->relatable_type === Token::class && $this->relatable !== null) { + return route('tokens.details', $this->relatable); + } + + return null; + } + + /** + * Create a new factory instance for the model. + * + * @phpstan-ignore-next-line + * @return DatabaseNotificationFactory + */ + protected static function newFactory() : Factory + { + return new DatabaseNotificationFactory(); + } +} diff --git a/app/Domain/User/Models/User.php b/app/Domain/User/Models/User.php new file mode 100644 index 0000000..0d579c4 --- /dev/null +++ b/app/Domain/User/Models/User.php @@ -0,0 +1,179 @@ + 'array', + 'email_verified_at' => 'datetime', + 'onboarded_at' => 'datetime', + 'last_login_at' => 'datetime', + ]; + + public function ownedTokens() : HasMany + { + return $this->hasMany(Token::class); + } + + public function tokens(): BelongsToMany + { + return $this + ->belongsToMany(Token::class, 'token_users', 'user_id', 'token_id') + ->using(Collaborator::class) + ->withPivot(['role', 'permissions']) + ->whereHas('statuses', fn (Builder $query) => $query->where('name', TokenStatusEnum::FINISHED)); + } + + public function invitations(): HasMany + { + return $this->hasMany(Invitation::class)->orWhere('email', $this->email); + } + + public function secureShellKeys(): HasMany + { + return $this->hasMany(SecureShellKey::class); + } + + public function starredNotifications(): MorphMany + { + return $this->notifications()->where('is_starred', true); + } + + public function hasTokens(): bool + { + return $this->tokens->isNotEmpty(); + } + + public function onToken(Token $token): bool + { + return $token->collaborators->contains($this); + } + + public function ownsToken(Token $token): bool + { + $ownerId = $token->user_id; + + return $ownerId !== 0 && $this->id === $ownerId; + } + + public function roleOn(Token $token): ?string + { + if ($this->tokens->contains($token)) { + // https://github.com/nunomaduro/larastan/issues/515 + /* @phpstan-ignore-next-line */ + return $this->tokens->find($token->id)?->pivot->role; + } + + return null; + } + + public function permissionsOn(Token $token): ?array + { + if ($this->tokens->contains($token)) { + // https://github.com/nunomaduro/larastan/issues/515 + /* @phpstan-ignore-next-line */ + return $this->tokens->find($token->id)?->pivot->permissions; + } + + return null; + } + + public function notifications(): MorphMany + { + return $this + ->morphMany(DatabaseNotification::class, 'notifiable') + ->orderBy('created_at', 'desc') + ->orderBy('id'); + } + + public function hasNewNotifications(): bool + { + $latestNotification = $this->notifications()->latest()->first(); + + if ($latestNotification === null || $latestNotification->created_at === null) { + return false; + } + + if ($this->seen_notifications_at === null) { + return true; + } + + return $latestNotification->created_at->isAfter($this->seen_notifications_at); + } + + /** + * @codeCoverageIgnore + */ + public function selectPersonalData(PersonalDataSelection $personalData): void + { + $personalData->add(sprintf('%s.json', Str::slug($this->name)), [ + 'name' => $this->name, + 'email' => $this->email, + ]); + } + + /** + * @codeCoverageIgnore + */ + public function personalDataExportName(): string + { + return 'personal-data-'.Str::slug($this->name).'.zip'; + } + + public function waitingForEmailConfirmation() : bool + { + if ($this->getMetaAttribute('email_to_update') === null) { + return false; + } + + return Carbon::parse( + $this->getMetaAttribute('email_to_update_stored_at') + )->gte(now()->subDay()); + } + + public function sendEmailChangeConfirmationMail(string $email) : void + { + $email = strtolower($email); + + Mail::to($email)->send(new ConfirmEmailChange($email, $this->name)); + + $this->setMetaAttribute('email_to_update', $email); + $this->setMetaAttribute('email_to_update_stored_at', now()->toString()); + } + + /** + * Create a new factory instance for the model. + * + * @return Factory + */ + protected static function newFactory() + { + return new UserFactory(); + } +} diff --git a/app/Domain/User/Observers/UserObserver.php b/app/Domain/User/Observers/UserObserver.php new file mode 100644 index 0000000..e340a7e --- /dev/null +++ b/app/Domain/User/Observers/UserObserver.php @@ -0,0 +1,32 @@ +forceDeleteUserOwnedTokens($user); + $this->deleteUserSecureShellKeys($user); + $this->deleteUserInvitations($user); + } + + private function forceDeleteUserOwnedTokens(User $user): void + { + $user->ownedTokens()->withTrashed()->get()->each->forceDelete(); + } + + private function deleteUserSecureShellKeys(User $user): void + { + $user->secureShellKeys()->get()->each->delete(); + } + + private function deleteUserInvitations(User $user): void + { + $user->invitations()->get()->each->delete(); + } +} diff --git a/app/Support/AddressPrefixes.php b/app/Support/AddressPrefixes.php new file mode 100644 index 0000000..e8208aa --- /dev/null +++ b/app/Support/AddressPrefixes.php @@ -0,0 +1,79 @@ + 0, + '2' => 3, + '3' => 5, + '4' => 8, + '5' => 10, + '6' => 13, + '7' => 15, + '8' => 18, + '9' => 20, + 'A' => 23, + 'B' => 25, + 'C' => 28, + 'D' => 30, + 'E' => 33, + 'F' => 35, + 'G' => 38, + 'H' => 40, + 'J' => 43, + 'K' => 45, + 'L' => 48, + 'M' => 50, + 'N' => 53, + 'P' => 55, + 'Q' => 58, + 'R' => 60, + 'S' => 63, + 'T' => 65, + 'U' => 68, + 'V' => 70, + 'W' => 73, + 'X' => 75, + 'Y' => 78, + 'Z' => 80, + 'a' => 83, + 'b' => 85, + 'c' => 87, + 'd' => 90, + 'e' => 92, + 'f' => 95, + 'g' => 97, + 'h' => 100, + 'i' => 102, + 'j' => 105, + 'k' => 107, + 'm' => 110, + 'n' => 112, + 'o' => 115, + 'p' => 117, + 'q' => 120, + 'r' => 122, + 's' => 125, + 't' => 127, + 'u' => 130, + 'v' => 132, + 'w' => 135, + 'x' => 137, + 'y' => 140, + 'z' => 142, + ]; + + public static function get(string $prefix): int + { + return static::$prefixes[$prefix]; + } + + public static function valid(string $prefix): bool + { + return array_key_exists($prefix, static::$prefixes); + } +} diff --git a/app/Support/Builders/NotificationBuilder.php b/app/Support/Builders/NotificationBuilder.php new file mode 100644 index 0000000..e8a89e2 --- /dev/null +++ b/app/Support/Builders/NotificationBuilder.php @@ -0,0 +1,100 @@ +content = $this->fromToken( + $invitation->token ?? null, + array_merge($data, ['invitation' => $invitation->id]), + )->getContent(); + + return $this; + } + + public function fromServer(Server $server, array $data, ?Token $token = null): self + { + $this->content = $this->fromToken( + $token ?? $server->token, + array_merge($data, ['server' => $server->id]), + )->getContent(); + + return $this; + } + + public function fromServerProvider(ServerProvider $serverProvider, array $data): self + { + $this->content = $this->fromToken( + $serverProvider->token, + array_merge($data, ['serverProvider' => $serverProvider->id]), + )->getContent(); + + return $this; + } + + public function fromToken(?Token $token, array $data): self + { + $this->content = array_merge($data, [ + 'token' => $token->id ?? null, + 'type' => $this->type, + 'relatable_id' => $token->id ?? null, + 'relatable_type' => Token::class, + ]); + + return $this; + } + + public function withAction(string $title, string $url): self + { + $this->content = array_merge($this->content, ['action' => ['title' => $title, 'url' => $url]]); + + return $this; + } + + public function withUser(User $user): self + { + $this->content = array_merge($this->content, ['user' => $user->id]); + + return $this; + } + + public function success(): self + { + $this->content['type'] = 'success'; + + return $this; + } + + public function danger(): self + { + $this->content['type'] = 'danger'; + + return $this; + } + + public function warning(): self + { + $this->content['type'] = 'warning'; + + return $this; + } + + public function getContent(): array + { + return $this->content; + } +} diff --git a/app/Support/Components/Concerns/HasDefaultRender.php b/app/Support/Components/Concerns/HasDefaultRender.php new file mode 100644 index 0000000..8a83617 --- /dev/null +++ b/app/Support/Components/Concerns/HasDefaultRender.php @@ -0,0 +1,17 @@ +emit('flashMessage', [$message, $type]); + } + + public function toast(string $message, string $type = 'success'): void + { + $this->emit('toastMessage', [$message, $type]); + } +} diff --git a/app/Support/Components/Concerns/InteractsWithPermissions.php b/app/Support/Components/Concerns/InteractsWithPermissions.php new file mode 100644 index 0000000..60d6e62 --- /dev/null +++ b/app/Support/Components/Concerns/InteractsWithPermissions.php @@ -0,0 +1,22 @@ +permissions = Arr::flatten($this->getAvailablePermissionsProperty()); + } + + public function deselectAll(): void + { + $this->permissions = []; + } +} diff --git a/app/Support/Components/Concerns/InteractsWithToken.php b/app/Support/Components/Concerns/InteractsWithToken.php new file mode 100644 index 0000000..3f34699 --- /dev/null +++ b/app/Support/Components/Concerns/InteractsWithToken.php @@ -0,0 +1,18 @@ +token = $token; + } +} diff --git a/app/Support/Components/Concerns/InteractsWithUser.php b/app/Support/Components/Concerns/InteractsWithUser.php new file mode 100644 index 0000000..7e1bf68 --- /dev/null +++ b/app/Support/Components/Concerns/InteractsWithUser.php @@ -0,0 +1,20 @@ + [ + 'transfer' => null, + 'secondSignature' => null, + 'delegateRegistration' => null, + 'vote' => null, + 'multiSignature' => null, + 'ipfs' => null, + 'multiPayment' => null, + 'delegateResignation' => null, + ], + 'dynamic' => [ + 'enabled' => true, + 'minFeePool' => null, + 'minFeeBroadcast' => null, + 'addonBytes' => [ + 'transfer' => null, + 'secondSignature' => null, + 'delegateRegistration' => null, + 'vote' => null, + 'multiSignature' => null, + 'ipfs' => null, + 'multiPayment' => null, + 'delegateResignation' => null, + ], + ], + ]; + + public function mount(Token $tokenObject): void + { + if (is_array($tokenObject->config)) { + $this->fill($tokenObject->config); + } + + $this->tokenObject = $tokenObject; + } + + public function render(): View + { + return view('livewire.manage-token'); + } + + public function updatedConfig(): void + { + $this->validate([ + 'config' => ['required', 'max:1024'], + ]); + + try { + if (! is_string($content = file_get_contents($this->config->getRealPath()))) { + // We'll throw this error to break out of the try catch. We can't test if the NoFileException is thrown + throw new NoFileException(); // @codeCoverageIgnore + } + + $config = Json::parseConfig($content); + + foreach ($config as $key => $value) { + if ($key === 'fees') { + $this->fees = array_merge($this->fees, $value); + } else { + $this->setProtectedPropertyValue($key, $value === 'localhost' ? '127.0.0.1' : $value); + } + } + } catch (Throwable) { + $this->addError('config', 'We were unable to parse the provided config file'); + } + } + + public function updated(string $propertyName): void + { + $this->validateRequest($propertyName); + } + + public function update(): void + { + $data = $this->validateRequest(); + + $this->store($data, true); + } + + public function cancel(): void + { + $this->redirectRoute('home'); + } + + public function store(array $data, bool $final = false): void + { + $this->tokenObject->name = $data['chainName']; + + if ($this->step === 3 && ! $this->fees['dynamic']['enabled']) { + unset($data['fees']['dynamic']['addonBytes']); + } + + $this->tokenObject->config = $data; + + $this->tokenObject->setMetaAttribute(TokenAttributeEnum::REPO_NAME, $this->tokenObject->config['chainName'] ?? null); + + if ($final && TokenStatusEnum::isPending($this->tokenObject->status)) { + // Create the SSH keys for this token... + $this->tokenObject->setKeypair(SecureShellKey::make('')); + + $this->tokenObject->setStatus(TokenStatusEnum::FINISHED); + } + + $this->tokenObject->save(); + + if ($final) { + // Complete the configuration onboarding.... + $this->tokenObject->onboarding()->completeConfiguration(); + + alert('tokens.token_updated', FlashType::SUCCESS); + + $this->redirectRoute('tokens.show', $this->tokenObject); + } + } + + public function next(): void + { + $data = $this->validateRequest(); + + $this->store(array_merge($this->tokenObject->config ?? [], $data)); + + $this->step += 1; + + if ($this->isLastStep()) { + $this->hasReachedReviewStage = true; + } + } + + public function previous(): void + { + $this->step -= 1; + } + + public function isLastStep(): bool + { + return $this->step === 4; + } + + public function setStep(int $step): void + { + if ($step > 0 && $step <= $this->steps) { + $this->step = $step; + } + } + + public function handleDefaults(array $inputs): void + { + $this->inputs = $inputs; + + foreach ($inputs as $input) { + if ($this->getPropertyValue($input) !== '') { + $this->emit('askForConfirmation', false); + + return; + } + } + + $this->setDefaults(); + } + + public function handleFeeDefaults(array $inputs): void + { + $this->inputs = $inputs; + + foreach ($inputs as $input) { + if (! is_null(Arr::get($this->fees, $input))) { + $this->emit('askForConfirmation', true); + + return; + } + } + + $this->setFeeDefaults(); + } + + public function setDefaults(?bool $overwrite = false): void + { + foreach ($this->inputs as $input) { + if ($overwrite === false && $this->getPropertyValue($input)) { + // Skip fields that are already filled in + continue; + } + $this->setProtectedPropertyValue($input, trans('forms.create_token.input_'.Str::snake($input).'_placeholder')); + $this->updated($input); + } + $this->emit('closeModal'); + } + + public function setFeeDefaults(?bool $overwrite = false): void + { + foreach ($this->inputs as $input) { + if ($overwrite === false && ! is_null(Arr::get($this->fees, $input))) { + // Skip fields that are already filled in + continue; + } + Arr::set($this->fees, $input, trans('forms.create_token.'.Str::snake($input).'_placeholder')); + $this->updated($input); + } + $this->emit('closeModal'); + } + + public function returnToReview(): void + { + $data = $this->validateRequest(); + + $this->store(array_merge($this->tokenObject->config ?? [], $data)); + + $this->setStep(4); + } + + public function cancelChanges(): void + { + $this->fill($this->tokenObject->config); + $this->resetErrorBag(); + $this->setStep(4); + } + + private function validateRequest(?string $propertyName = null): array + { + $step1 = $this->step1Rules(); + + $step2 = [ + 'forgers' => ['required', 'integer'], + 'blocktime' => ['required', 'integer'], + 'transactionsPerBlock' => ['required', 'integer'], + 'maxBlockPayload' => ['required', 'integer'], + 'totalPremine' => ['required', 'integer'], + 'rewardHeightStart' => ['required', 'integer'], + 'rewardPerBlock' => ['required', 'integer'], + 'vendorFieldLength' => ['required', 'integer', 'max:255'], + 'wif' => ['required', 'integer', 'max:255'], + 'p2pPort' => ['required', new Port(), ...$this->uniquePortRules('p2pPort')], + 'apiPort' => ['required', new Port(), ...$this->uniquePortRules('apiPort')], + 'webhookPort' => ['required', new Port(), ...$this->uniquePortRules('webhookPort')], + 'monitorPort' => ['required', new Port(), ...$this->uniquePortRules('monitorPort')], + 'coreIp' => ['required', 'ipv4'], + 'explorerIp' => ['required', 'ipv4'], + 'explorerPort' => ['required', new Port(), ...$this->uniquePortRules('explorerPort')], + 'databaseHost' => ['required', 'ipv4'], + 'databasePort' => ['required', new Port(), ...$this->uniquePortRules('databasePort')], + 'databaseName' => ['required', 'max:32'], + ]; + + $step3 = [ + 'fees' => ['required', 'array'], + 'fees.static' => ['required', 'array'], + 'fees.static.transfer' => ['required', 'integer'], + 'fees.static.vote' => ['required', 'integer'], + 'fees.static.secondSignature' => ['required', 'integer'], + 'fees.static.delegateRegistration' => ['required', 'integer'], + 'fees.static.multiSignature' => ['required', 'integer'], + 'fees.static.ipfs' => ['required', 'integer'], + 'fees.static.multiPayment' => ['required', 'integer'], + 'fees.static.delegateResignation' => ['required', 'integer'], + 'fees.dynamic' => ['required', 'array'], + 'fees.dynamic.enabled' => ['required', 'bool'], + 'fees.dynamic.minFeePool' => ['required', 'integer'], + 'fees.dynamic.minFeeBroadcast' => ['required', 'integer'], + 'fees.dynamic.addonBytes' => ['required_if:fees.dynamic.enabled,true', 'array'], + 'fees.dynamic.addonBytes.transfer' => ['required_if:fees.dynamic.enabled,true|integer'], + 'fees.dynamic.addonBytes.secondSignature' => ['required_if:fees.dynamic.enabled,true|integer'], + 'fees.dynamic.addonBytes.delegateRegistration' => ['required_if:fees.dynamic.enabled,true|integer'], + 'fees.dynamic.addonBytes.vote' => ['required_if:fees.dynamic.enabled,true|integer'], + 'fees.dynamic.addonBytes.multiSignature' => ['required_if:fees.dynamic.enabled,true|integer'], + 'fees.dynamic.addonBytes.ipfs' => ['required_if:fees.dynamic.enabled,true|integer'], + 'fees.dynamic.addonBytes.multiPayment' => ['required_if:fees.dynamic.enabled,true|integer'], + 'fees.dynamic.addonBytes.delegateResignation' => ['required_if:fees.dynamic.enabled,true|integer'], + ]; + + $validators = [ + '1' => $step1, + '2' => $step2, + '3' => $step3, + '4' => array_merge($step1, $step2, $step3), + ]; + + if ($propertyName !== null) { + return $this->validateOnly($propertyName, $validators[$this->step]); + } + + return $this->validate($validators[$this->step]); + } + + private function uniquePortRules(string $field) : array + { + return array_values(array_diff([ + 'different:p2pPort', + 'different:apiPort', + 'different:webhookPort', + 'different:monitorPort', + 'different:explorerPort', + 'different:databasePort', + ], ['different:'.$field])); + } +} diff --git a/app/Support/Components/Concerns/Sortable.php b/app/Support/Components/Concerns/Sortable.php new file mode 100644 index 0000000..d9544a2 --- /dev/null +++ b/app/Support/Components/Concerns/Sortable.php @@ -0,0 +1,29 @@ +sortBy === $name) { + if ($this->sortDirection === 'asc') { + $this->sortDirection = 'desc'; + } else { + $this->sortDirection = null; + $this->sortBy = null; + } + } else { + $this->sortBy = $name; + $this->sortDirection = 'asc'; + } + + $this->sortingUpdated(); + } +} diff --git a/app/Support/Components/YoutubeModal.php b/app/Support/Components/YoutubeModal.php new file mode 100644 index 0000000..5bd12e7 --- /dev/null +++ b/app/Support/Components/YoutubeModal.php @@ -0,0 +1,37 @@ + 'showModal', + ]; + + public function mount(string $url): void + { + $this->url = $url; + } + + public function showModal(): void + { + $this->showModal = true; + } + + public function closeModal(): void + { + $this->showModal = false; + } +} diff --git a/app/Support/Eloquent/Concerns/HasSchemalessAttributes.php b/app/Support/Eloquent/Concerns/HasSchemalessAttributes.php new file mode 100644 index 0000000..0eeb742 --- /dev/null +++ b/app/Support/Eloquent/Concerns/HasSchemalessAttributes.php @@ -0,0 +1,67 @@ +encryptedExtraAttributes as $encryptedExtraAttribute) { + $resolvedEncryptedAttribute = $attributes->get($encryptedExtraAttribute); + if (! is_null($resolvedEncryptedAttribute)) { + $attributes->set($encryptedExtraAttribute, decrypt($resolvedEncryptedAttribute)); + } + } + } + + return $attributes; + } + + public function setExtraAttributesAttribute(mixed $value): void + { + /* @phpstan-ignore-next-line */ + if (property_exists($this, 'encryptedExtraAttributes')) { + foreach ($this->encryptedExtraAttributes as $encryptedExtraAttribute) { + if (! is_null(Arr::get($value, $encryptedExtraAttribute))) { + $value[$encryptedExtraAttribute] = encrypt($value[$encryptedExtraAttribute]); + } + } + } + + $this->attributes['extra_attributes'] = json_encode($value); + } + + public function scopeWithExtraAttributes(): Builder + { + return $this->extra_attributes->modelScope(); + } + + public function getMetaAttribute(mixed $name): mixed + { + return $this->extra_attributes->get($name); + } + + public function setMetaAttribute(mixed $name, mixed $value): void + { + $this->extra_attributes->set($name, $value); + + $this->save(); + } + + public function forgetMetaAttribute(mixed $name): void + { + $this->extra_attributes->forget($name); + + $this->save(); + } +} diff --git a/app/Support/Eloquent/Model.php b/app/Support/Eloquent/Model.php new file mode 100644 index 0000000..2d0e39b --- /dev/null +++ b/app/Support/Eloquent/Model.php @@ -0,0 +1,29 @@ +any($abilities, $arguments)) { + return Response::allow(); + } + + throw new AuthorizationException(); + } +} diff --git a/app/Support/Http/Middleware/Authenticate.php b/app/Support/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..7675bd5 --- /dev/null +++ b/app/Support/Http/Middleware/Authenticate.php @@ -0,0 +1,25 @@ +expectsJson()) { + return route('login'); + } + } +} diff --git a/app/Support/Http/Middleware/EncryptCookies.php b/app/Support/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..f769c89 --- /dev/null +++ b/app/Support/Http/Middleware/EncryptCookies.php @@ -0,0 +1,18 @@ +check()) { + return redirect(route('tokens')); + } + + return $next($request); + } +} diff --git a/app/Support/Http/Middleware/RedirectIfOnboarding.php b/app/Support/Http/Middleware/RedirectIfOnboarding.php new file mode 100644 index 0000000..4e21a35 --- /dev/null +++ b/app/Support/Http/Middleware/RedirectIfOnboarding.php @@ -0,0 +1,24 @@ +route('token'); + + if ($token->canBeEdited()) { + return redirect(route('tokens.welcome', $token)); + } + + return $next($request); + } +} diff --git a/app/Support/Http/Middleware/ThrottleWithSessionToken.php b/app/Support/Http/Middleware/ThrottleWithSessionToken.php new file mode 100644 index 0000000..859e391 --- /dev/null +++ b/app/Support/Http/Middleware/ThrottleWithSessionToken.php @@ -0,0 +1,50 @@ +resolveRequestSignature($request); + + $maxAttempts = $this->resolveMaxAttempts($request, $maxAttempts); + + if ($this->limiter->tooManyAttempts($key, $maxAttempts)) { + $request->session()->forget('app:auth:id'); + + throw $this->buildException($request, $key, $maxAttempts); + } + + $this->limiter->hit($key, (int) $decayMinutes * 60); + + $response = $next($request); + + return $this->addHeaders( + $response, + $maxAttempts, + $this->calculateRemainingAttempts($key, $maxAttempts) + ); + } +} diff --git a/app/Support/Http/Middleware/TrimStrings.php b/app/Support/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..2cf86f0 --- /dev/null +++ b/app/Support/Http/Middleware/TrimStrings.php @@ -0,0 +1,20 @@ +mnemonicToEntropy($value); + + return true; + } catch (InvalidArgumentException) { + return false; + } + } + + public function message() + { + return trans('validation.messages.bip39_passphrase'); + } +} diff --git a/app/Support/Rules/Port.php b/app/Support/Rules/Port.php new file mode 100644 index 0000000..c737bb1 --- /dev/null +++ b/app/Support/Rules/Port.php @@ -0,0 +1,20 @@ + 1023 && $value < 65535; + } + + public function message() + { + return trans('validation.messages.port'); + } +} diff --git a/app/Support/Services/ActivityLogger.php b/app/Support/Services/ActivityLogger.php new file mode 100644 index 0000000..8711092 --- /dev/null +++ b/app/Support/Services/ActivityLogger.php @@ -0,0 +1,20 @@ +performedOn($model) + ->causedBy($causer) + ->withProperties(array_merge(['user_id' => $userId ?? Auth::id()], $properties)) + ->log($action); + } +} diff --git a/app/Support/Services/Haiku.php b/app/Support/Services/Haiku.php new file mode 100644 index 0000000..c262676 --- /dev/null +++ b/app/Support/Services/Haiku.php @@ -0,0 +1,217 @@ +token->onboarded_at); + } + + public function fulfilled(): bool + { + foreach ($this->requiredSteps as $step) { + if (! $this->completed($step)) { + return false; + } + } + + return true; + } + + public function completeConfiguration(): void + { + $this->token->setMetaAttribute('onboarding.configuration_completed_at', Carbon::now()); + } + + public function completed(string $name): bool + { + if ($name === TokenOnboardingStatusEnum::CONFIGURATION) { + return $this->token->getMetaAttribute('onboarding.configuration_completed_at') !== null; + } + + if ($name === TokenOnboardingStatusEnum::SERVER_PROVIDERS) { + return $this->completed(TokenOnboardingStatusEnum::CONFIGURATION) + && $this->token->serverProviders()->exists(); + } + + if ($name === TokenOnboardingStatusEnum::SERVER_CONFIGURATION) { + return $this->completed(TokenOnboardingStatusEnum::SERVER_PROVIDERS) + && $this->token->hasServerConfiguration(); + } + + if ($name === TokenOnboardingStatusEnum::SECURE_SHELL_KEYS) { + return $this->completed(TokenOnboardingStatusEnum::SERVER_CONFIGURATION) + && $this->token->secureShellKeys()->exists(); + } + + if ($name === TokenOnboardingStatusEnum::COLLABORATORS) { + return $this->completed(TokenOnboardingStatusEnum::SECURE_SHELL_KEYS) + && $this->token->invitations()->exists(); + } + + return $this->token->servers()->exists(); + } + + public function pending(string $name): bool + { + return ! $this->completed($name); + } + + public function available(string $name): bool + { + if ($this->completed(TokenOnboardingStatusEnum::SERVERS)) { + return true; + } + + if ($name === TokenOnboardingStatusEnum::CONFIGURATION) { + return true; + } + + if ($name === TokenOnboardingStatusEnum::SERVER_PROVIDERS) { + return $this->completed(TokenOnboardingStatusEnum::CONFIGURATION); + } + + if ($name === TokenOnboardingStatusEnum::SERVER_CONFIGURATION) { + return $this->completed(TokenOnboardingStatusEnum::SERVER_PROVIDERS); + } + + if ($name === TokenOnboardingStatusEnum::SECURE_SHELL_KEYS) { + return $this->completed(TokenOnboardingStatusEnum::SERVER_CONFIGURATION); + } + + return $this->completed(TokenOnboardingStatusEnum::SECURE_SHELL_KEYS); + } + + public function isStep(string $title): bool + { + return in_array($title, TokenOnboardingStatusEnum::all(), true); + } +} diff --git a/app/Support/Services/PasswordGenerator.php b/app/Support/Services/PasswordGenerator.php new file mode 100644 index 0000000..d2fbfa4 --- /dev/null +++ b/app/Support/Services/PasswordGenerator.php @@ -0,0 +1,15 @@ +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..ff02ff9303a8278e7b07a1028b49b268927da791 GIT binary patch literal 78911 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 + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..888b7ab --- /dev/null +++ b/composer.json @@ -0,0 +1,125 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The Laravel Framework.", + "keywords": [ + "framework", + "laravel" + ], + "license": "MIT", + "require": { + "php": "^8.0", + "arkecosystem/crypto": "^1.8", + "arkecosystem/foundation": "^10.6", + "aws/aws-sdk-php": "^3.247", + "bitwasp/bitcoin": "^1.0", + "blade-ui-kit/blade-icons": "^1.4", + "doctrine/dbal": "^3.0", + "fruitcake/laravel-cors": "^3.0", + "huddledigital/zendesk-laravel": "^3.7", + "laravel/framework": "^9.41", + "laravel/horizon": "^5.10", + "laravel/tinker": "^2.7", + "nyholm/psr7": "^1.5", + "predis/predis": "^1.0", + "propaganistas/laravel-fakeid": "^4.0", + "sentry/sentry-laravel": "^2.1", + "spatie/data-transfer-object": "^3.9", + "spatie/laravel-activitylog": "^4.7", + "spatie/laravel-backup": "^8.1", + "spatie/laravel-flash": "^1.9", + "spatie/laravel-medialibrary": "^10.7", + "spatie/laravel-model-status": "^1.11", + "spatie/laravel-personal-data-export": "^4.2", + "spatie/laravel-responsecache": "^7.4", + "spatie/laravel-sluggable": "^3.4", + "staudenmeir/belongs-to-through": "^2.12", + "symfony/psr-http-message-bridge": "^2.1" + }, + "require-dev": { + "barryvdh/laravel-debugbar": "^3.7", + "spatie/laravel-ignition": "^1.6", + "laravel/dusk": "^6.1", + "laravel/sail": "^1.16", + "spatie/phpunit-snapshot-assertions": "^4.2", + "timacdonald/log-fake": "^2.0" + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "phpstan/extension-installer": true, + "pestphp/pest-plugin": true, + "treeware/plant": true + } + }, + "extra": { + "laravel": { + "dont-discover": [ + "laravel/fortify", + "laravel/telescope" + ] + } + }, + "autoload": { + "psr-4": { + "App\\": "app/App/", + "Domain\\": "app/Domain/", + "Support\\": "app/Support/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi", + "@php artisan vendor:publish --provider=\"ARKEcosystem\\Foundation\\Providers\\UserInterfaceServiceProvider\" --tag=\"pagination\" --tag=\"images\"" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ], + "post-update-cmd": [ + "@php artisan horizon:publish --ansi" + ], + "build": [ + "yarn format", + "yarn prod" + ], + "db:dev": [ + "@php artisan playbook:run DevelopmentPlaybook" + ], + "db:demo": [ + "@php artisan playbook:run DemoPlaybook" + ], + "db:bare": [ + "@php artisan playbook:run BarePlaybook" + ], + "analyse": [ + "vendor/bin/phpstan analyse --memory-limit=2G --configuration vendor/arkecosystem/foundation/phpstan.neon" + ], + "format": [ + "vendor/bin/php-cs-fixer fix --config=vendor/arkecosystem/foundation/.php-cs-fixer.php" + ], + "test": [ + "./vendor/bin/pest" + ], + "test:fast": [ + "./vendor/bin/pest --parallel" + ], + "test:coverage": [ + "./vendor/bin/pest --coverage --min=100 --coverage-html=.coverage --coverage-clover=coverage.xml" + ] + } +} \ No newline at end of file diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..3d0528c --- /dev/null +++ b/composer.lock @@ -0,0 +1,17497 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "87170660706c11e28693169bed5d50ce", + "packages": [ + { + "name": "arkecosystem/crypto", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/ArkEcosystem/php-crypto.git", + "reference": "d575bd6dd29725ac6916a4b08d9017dea0637345" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ArkEcosystem/php-crypto/zipball/d575bd6dd29725ac6916a4b08d9017dea0637345", + "reference": "d575bd6dd29725ac6916a4b08d9017dea0637345", + "shasum": "" + }, + "require": { + "bitwasp/bitcoin": "^1.0", + "php": "^7.4|^8.0", + "simplito/elliptic-php": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "graham-campbell/analyzer": "^3.0", + "illuminate/support": "^7.0|^8.0", + "mockery/mockery": "^1.2", + "pestphp/drift": "^0.3", + "pestphp/pest": "^1.0", + "pestphp/pest-plugin-parallel": "^0.3.1", + "phpunit/phpunit": "^9.5", + "symfony/var-dumper": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "ArkEcosystem\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Faust", + "email": "hello@brianfaust.me", + "homepage": "https://github.com/faustbrian" + } + ], + "description": "A simple PHP Cryptography Implementation for the Ark Blockchain.", + "keywords": [ + "api", + "ark", + "blockchain", + "crypto", + "currency" + ], + "support": { + "issues": "https://github.com/ArkEcosystem/php-crypto/issues", + "source": "https://github.com/ArkEcosystem/php-crypto/tree/1.8.0" + }, + "time": "2021-09-24T07:33:57+00:00" + }, + { + "name": "arkecosystem/foundation", + "version": "10.18.2", + "source": { + "type": "git", + "url": "https://github.com/ArkEcosystem/laravel-foundation.git", + "reference": "bdf3f2a410e105e07ecd8d8cba0918c5597d88b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ArkEcosystem/laravel-foundation/zipball/bdf3f2a410e105e07ecd8d8cba0918c5597d88b9", + "reference": "bdf3f2a410e105e07ecd8d8cba0918c5597d88b9", + "shasum": "" + }, + "require": { + "calebporzio/sushi": "^2.4", + "danharrin/livewire-rate-limiting": "^1.0", + "elgigi/commonmark-emoji": "^2.0", + "ergebnis/phpstan-rules": "^1.0", + "fakerphp/faker": "^1.20", + "friendsofphp/php-cs-fixer": "^3.12", + "google/recaptcha": "^1.2", + "graham-campbell/analyzer": "^3.1", + "guzzlehttp/guzzle": "^7.5", + "illuminate/bus": "^9.36", + "illuminate/contracts": "^9.36", + "illuminate/http": "^9.36", + "illuminate/mail": "^9.36", + "illuminate/support": "^9.36", + "illuminate/view": "^9.36", + "jamesmills/laravel-timezone": "^1.11", + "jasonmccreary/laravel-test-assertions": "^2.1", + "jenssegers/agent": "^2.6", + "johnkary/phpunit-speedtrap": "^4.0", + "laravel/fortify": "^1.13", + "laravel/telescope": "^4.9", + "league/commonmark": "^2.3", + "livewire/livewire": "^2.10", + "mockery/mockery": "^1.5", + "nunomaduro/collision": "^6.3", + "nunomaduro/larastan": "^2.2", + "orchestra/testbench": "^7.11", + "pestphp/pest": "^1.22", + "pestphp/pest-plugin-faker": "^1.0", + "pestphp/pest-plugin-laravel": "^1.3", + "pestphp/pest-plugin-livewire": "^1.0", + "pestphp/pest-plugin-parallel": "^1.2", + "php": "^8.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^9.5", + "pragmarx/google2fa-laravel": "^2.0", + "rector/rector": "^0.14", + "ruafozy/mersenne-twister": "^1.3", + "spatie/laravel-flash": "^1.9", + "spatie/laravel-honeypot": "^4.3", + "spatie/laravel-medialibrary": "^10.6", + "spatie/laravel-newsletter": "^4.11", + "spatie/laravel-package-tools": "^1.13", + "spatie/laravel-personal-data-export": "^4.2", + "spatie/laravel-responsecache": "^7.4", + "spatie/laravel-schemaless-attributes": "^2.3", + "spatie/laravel-sluggable": "^3.4", + "spatie/pest-plugin-snapshots": "^1.1", + "spatie/regex": "^3.1", + "spatie/yaml-front-matter": "^2.0" + }, + "require-dev": { + "laravel/nova": "^4.13", + "spatie/laravel-permission": "^5.5", + "vyuldashev/nova-permission": "^3.2" + }, + "suggest": { + "laravel/nova": "Needed for backend management of data", + "spatie/laravel-permission": "Needed for nova permissions & roles", + "vyuldashev/nova-permission": "Needed for nova permissions & roles" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "ARKEcosystem\\Foundation\\Providers\\FoundationServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/UserInterface/helpers.php" + ], + "psr-4": { + "ARKEcosystem\\Foundation\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "ItsANameToo", + "email": "itsanametoo@protonmail.com" + } + ], + "description": "User-Interface Scaffolding for Laravel. Powered by Tailwind CSS.", + "support": { + "issues": "https://github.com/ArkEcosystem/laravel-foundation/issues", + "source": "https://github.com/ArkEcosystem/laravel-foundation/tree/10.18.2" + }, + "time": "2022-10-27T14:26:45+00:00" + }, + { + "name": "aws/aws-crt-php", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "3942776a8c99209908ee0b287746263725685732" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/3942776a8c99209908ee0b287746263725685732", + "reference": "3942776a8c99209908ee0b287746263725685732", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.4.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.2" + }, + "time": "2021-09-03T22:57:30+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.247.2", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "00542e760d8464e0ee635f916841fdfbd1ceb95c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/00542e760d8464e0ee635f916841fdfbd1ceb95c", + "reference": "00542e760d8464e0ee635f916841fdfbd1ceb95c", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.0.2", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/psr7": "^1.8.5 || ^2.3", + "mtdowling/jmespath.php": "^2.6", + "php": ">=5.5" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Aws\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "support": { + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.247.2" + }, + "time": "2022-11-23T19:35:36+00:00" + }, + { + "name": "bacon/bacon-qr-code", + "version": "2.0.7", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "d70c840f68657ce49094b8d91f9ee0cc07fbf66c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/d70c840f68657ce49094b8d91f9ee0cc07fbf66c", + "reference": "d70c840f68657ce49094b8d91f9ee0cc07fbf66c", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.1", + "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.7" + }, + "time": "2022-03-14T02:02:36+00:00" + }, + { + "name": "bitwasp/bech32", + "version": "v0.0.1", + "source": { + "type": "git", + "url": "https://github.com/Bit-Wasp/bech32.git", + "reference": "e1ea58c848a4ec59d81b697b3dfe9cc99968d0e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bit-Wasp/bech32/zipball/e1ea58c848a4ec59d81b697b3dfe9cc99968d0e7", + "reference": "e1ea58c848a4ec59d81b697b3dfe9cc99968d0e7", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^5.4.0", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/bech32.php" + ], + "psr-4": { + "BitWasp\\Bech32\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Unlicense" + ], + "authors": [ + { + "name": "Thomas Kerin", + "homepage": "https://thomaskerin.io", + "role": "Author" + } + ], + "description": "Pure (no dependencies) implementation of bech32", + "homepage": "https://github.com/bit-wasp/bech32", + "support": { + "issues": "https://github.com/Bit-Wasp/bech32/issues", + "source": "https://github.com/Bit-Wasp/bech32/tree/more-tests" + }, + "time": "2018-02-05T22:23:47+00:00" + }, + { + "name": "bitwasp/bitcoin", + "version": "1.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/Bit-Wasp/bitcoin-php.git", + "reference": "670063be60655500a327d5d470d6eba0d77c6941" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bit-Wasp/bitcoin-php/zipball/670063be60655500a327d5d470d6eba0d77c6941", + "reference": "670063be60655500a327d5d470d6eba0d77c6941", + "shasum": "" + }, + "require": { + "bitwasp/bech32": "^0.0.1", + "bitwasp/buffertools": "^0.5.0", + "composer/semver": "^1.4.0|^3.2.0", + "lastguest/murmurhash": "v2.0.0", + "mdanter/ecc": "^0.5.0", + "php-64bit": ">=7.0", + "pleonasm/merkle-tree": "1.0.0" + }, + "require-dev": { + "bitwasp/bitcoinconsensus": "v3.0.0", + "bitwasp/secp256k1-php": "^v0.2.0", + "ext-json": "*", + "nbobtc/bitcoind-php": "v2.0.2", + "phpunit/phpunit": "^5.4.0", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "suggest": { + "ext-bitcoinconsensus": "The bitcoinconsensus library for safest possible script verification", + "ext-secp256k1": "The secp256k1 library for fast and safe elliptic curve operations" + }, + "default-branch": true, + "type": "library", + "autoload": { + "files": [ + "src/Script/functions.php" + ], + "psr-4": { + "BitWasp\\Bitcoin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Unlicense" + ], + "authors": [ + { + "name": "Thomas Kerin", + "homepage": "https://thomaskerin.io", + "role": "Author" + } + ], + "description": "PHP Bitcoin library with functions for transactions, signatures, serialization, Random/Deterministic ECDSA keys, blocks, RPC bindings", + "homepage": "https://github.com/bit-wasp/bitcoin-php", + "support": { + "issues": "https://github.com/Bit-Wasp/bitcoin-php/issues", + "source": "https://github.com/Bit-Wasp/bitcoin-php/tree/1.0" + }, + "time": "2021-01-16T21:13:16+00:00" + }, + { + "name": "bitwasp/buffertools", + "version": "v0.5.7", + "source": { + "type": "git", + "url": "https://github.com/Bit-Wasp/buffertools-php.git", + "reference": "133746d0b514e0016d8479b54aa97475405a9f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bit-Wasp/buffertools-php/zipball/133746d0b514e0016d8479b54aa97475405a9f1f", + "reference": "133746d0b514e0016d8479b54aa97475405a9f1f", + "shasum": "" + }, + "require": { + "php-64bit": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "BitWasp\\Buffertools\\": "src/Buffertools/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Kerin", + "homepage": "https://thomaskerin.io" + }, + { + "name": "Ruben de Vries", + "email": "ruben@rubensayshi.com" + } + ], + "description": "Toolbox for working with binary and hex data. Similar to NodeJS Buffer.", + "support": { + "issues": "https://github.com/Bit-Wasp/buffertools-php/issues", + "source": "https://github.com/Bit-Wasp/buffertools-php/tree/v0.5.7" + }, + "time": "2020-01-17T21:31:49+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-icons.git", + "reference": "977559507feebba431019abf1b319d71dfdacd95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/977559507feebba431019abf1b319d71dfdacd95", + "reference": "977559507feebba431019abf1b319d71dfdacd95", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0|^9.0", + "illuminate/filesystem": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "illuminate/view": "^8.0|^9.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3|^6.0", + "symfony/finder": "^5.3|^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "orchestra/testbench": "^6.0|^7.0", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "BladeUI\\Icons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2022-09-30T11:26:24+00:00" + }, + { + "name": "brianium/paratest", + "version": "v6.6.5", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "31fd5d69b41725f383c9a083831eefcc7ecd9061" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/31fd5d69b41725f383c9a083831eefcc7ecd9061", + "reference": "31fd5d69b41725f383c9a083831eefcc7ecd9061", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "jean85/pretty-package-versions": "^2.0.5", + "php": "^7.3 || ^8.0", + "phpunit/php-code-coverage": "^9.2.17", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-timer": "^5.0.3", + "phpunit/phpunit": "^9.5.24", + "sebastian/environment": "^5.1.4", + "symfony/console": "^5.4.12 || ^6.1.4", + "symfony/process": "^5.4.11 || ^6.1.3" + }, + "require-dev": { + "doctrine/coding-standard": "^10.0.0", + "ext-pcov": "*", + "ext-posix": "*", + "infection/infection": "^0.26.14", + "malukenho/mcbumpface": "^1.1.5", + "squizlabs/php_codesniffer": "^3.7.1", + "symfony/filesystem": "^5.4.12 || ^6.1.4", + "vimeo/psalm": "^4.27.0" + }, + "bin": [ + "bin/paratest", + "bin/paratest.bat", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v6.6.5" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2022-10-28T12:22:26+00:00" + }, + { + "name": "brick/math", + "version": "0.10.2", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "4.25.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.10.2" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2022-08-10T22:54:19+00:00" + }, + { + "name": "calebporzio/sushi", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/calebporzio/sushi.git", + "reference": "cec0768285971add48f3ccebfefad856be6f5078" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/calebporzio/sushi/zipball/cec0768285971add48f3ccebfefad856be6f5078", + "reference": "cec0768285971add48f3ccebfefad856be6f5078", + "shasum": "" + }, + "require": { + "illuminate/database": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/support": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "php": "^7.1.3|^8.0" + }, + "require-dev": { + "doctrine/dbal": "^2.9", + "orchestra/database": "3.8.* || 3.9.* || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "orchestra/testbench": "3.8.* || 3.9.* || ^4.0 || ^6.0 || ^7.0", + "phpunit/phpunit": "^7.5 || ^8.4 || ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sushi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "Eloquent's missing \"array\" driver.", + "support": { + "source": "https://github.com/calebporzio/sushi/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://github.com/calebporzio", + "type": "github" + } + ], + "time": "2022-01-18T22:48:40+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-21T13:15:14+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-11-17T09:50:14+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "danharrin/livewire-rate-limiting", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/livewire-rate-limiting.git", + "reference": "b99facf5b607fb0cde92a6f254f437295339f7de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/b99facf5b607fb0cde92a6f254f437295339f7de", + "reference": "b99facf5b607fb0cde92a6f254f437295339f7de", + "shasum": "" + }, + "require": { + "illuminate/support": "^8.0|^9.0", + "php": "^8.0" + }, + "require-dev": { + "livewire/livewire": "^2.3", + "orchestra/testbench": "^6.2|^7.0", + "phpunit/phpunit": "^9.4", + "symplify/monorepo-builder": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DanHarrin\\LivewireRateLimiting\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Apply rate limiters to Laravel Livewire actions.", + "homepage": "https://github.com/danharrin/livewire-rate-limiting", + "support": { + "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", + "source": "https://github.com/danharrin/livewire-rate-limiting" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2022-01-21T11:26:58+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.3" + }, + "time": "2020-10-02T16:03:48+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.13.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "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": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.3" + }, + "time": "2022-07-02T10:48:51+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "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": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "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%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.5.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", + "reference": "f38ee8aaca2d58ee88653cb34a6a3880c23f38a5", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "10.0.0", + "jetbrains/phpstorm-stubs": "2022.2", + "phpstan/phpstan": "1.8.10", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "9.5.25", + "psalm/plugin-phpunit": "0.17.0", + "squizlabs/php_codesniffer": "3.7.1", + "symfony/cache": "^5.4|^6.0", + "symfony/console": "^4.4|^5.4|^6.0", + "vimeo/psalm": "4.29.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "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": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.5.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%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-10-24T07:26:18+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + }, + "time": "2022-05-02T15:47:09+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "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": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + }, + "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%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:59:15+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "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": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.6" + }, + "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%2Finflector", + "type": "tidelift" + } + ], + "time": "2022-10-20T09:10:12+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.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%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "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/1.2.3" + }, + "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": "2022-02-28T11:07:21+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2022-09-10T18:51:20+00:00" + }, + { + "name": "drewm/mailchimp-api", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/drewm/mailchimp-api.git", + "reference": "c6cdfab4ca6ddbc3b260913470bd0a4a5cb84c7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/drewm/mailchimp-api/zipball/c6cdfab4ca6ddbc3b260913470bd0a4a5cb84c7a", + "reference": "c6cdfab4ca6ddbc3b260913470bd0a4a5cb84c7a", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "7.0.*", + "vlucas/phpdotenv": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DrewM\\MailChimp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Drew McLellan", + "email": "drew.mclellan@gmail.com", + "homepage": "http://allinthehead.com/" + } + ], + "description": "Super-simple, minimum abstraction MailChimp API v3 wrapper", + "homepage": "https://github.com/drewm/mailchimp-api", + "support": { + "issues": "https://github.com/drewm/mailchimp-api/issues", + "source": "https://github.com/drewm/mailchimp-api/tree/master" + }, + "time": "2019-08-06T09:24:58+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.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/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2022-06-18T20:57:19+00:00" + }, + { + "name": "elgigi/commonmark-emoji", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ElGigi/CommonMarkEmoji.git", + "reference": "8e7bf0ecbb719ca7ecc2ecbd27e4a4422ed9ef50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ElGigi/CommonMarkEmoji/zipball/8e7bf0ecbb719ca7ecc2ecbd27e4a4422ed9ef50", + "reference": "8e7bf0ecbb719ca7ecc2ecbd27e4a4422ed9ef50", + "shasum": "" + }, + "require": { + "league/commonmark": "^2.0", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "commonmark-extension", + "autoload": { + "psr-4": { + "ElGigi\\CommonMarkEmoji\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "CommonMark extension adds UTF-8 emoji with Github tag for the `league/commonmark` PHP Markdown parsing engine, based on the CommonMark spec.", + "support": { + "issues": "https://github.com/ElGigi/CommonMarkEmoji/issues", + "source": "https://github.com/ElGigi/CommonMarkEmoji/tree/v2.0.0" + }, + "time": "2021-08-23T11:27:20+00:00" + }, + { + "name": "ergebnis/phpstan-rules", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/phpstan-rules.git", + "reference": "ebeced30d7e50324a94a83c19a59d75816e8fbb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/ebeced30d7e50324a94a83c19a59d75816e8fbb4", + "reference": "ebeced30d7e50324a94a83c19a59d75816e8fbb4", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "nikic/php-parser": "^4.2.3", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.0.0" + }, + "require-dev": { + "doctrine/orm": "^2.10.2", + "ergebnis/composer-normalize": "^2.15.0", + "ergebnis/license": "^1.1.0", + "ergebnis/php-cs-fixer-config": "^2.14.0", + "ergebnis/test-util": "^1.5.0", + "infection/infection": "~0.15.3", + "nette/di": "^3.0.11", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.0.0", + "phpunit/phpunit": "^8.5.21", + "psalm/plugin-phpunit": "~0.16.1", + "psr/container": "^1.0.0", + "vimeo/psalm": "^4.12.0", + "zendframework/zend-servicemanager": "^2.0.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\PHPStan\\Rules\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com" + } + ], + "description": "Provides additional rules for phpstan/phpstan.", + "homepage": "https://github.com/ergebnis/phpstan-rules", + "keywords": [ + "PHPStan", + "phpstan-extreme-rules", + "phpstan-rules" + ], + "support": { + "issues": "https://github.com/ergebnis/phpstan-rules/issues", + "source": "https://github.com/ergebnis/phpstan-rules" + }, + "funding": [ + { + "url": "https://github.com/localheinz", + "type": "github" + } + ], + "time": "2021-11-08T15:37:09+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/37f751c67a5372d4e26353bd9384bc03744ec77b", + "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "symfony/phpunit-bridge": "^4.4 || ^5.2" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.20-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.20.0" + }, + "time": "2022-07-20T13:12:54+00:00" + }, + { + "name": "fgrosse/phpasn1", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/fgrosse/PHPASN1.git", + "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/eef488991d53e58e60c9554b09b1201ca5ba9296", + "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296", + "shasum": "" + }, + "require": { + "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "~2.0", + "phpunit/phpunit": "^6.3 || ^7.0 || ^8.0" + }, + "suggest": { + "ext-bcmath": "BCmath is the fallback extension for big integer calculations", + "ext-curl": "For loading OID information from the web if they have not bee defined statically", + "ext-gmp": "GMP is the preferred extension for big integer calculations", + "phpseclib/bcmath_compat": "BCmath polyfill for servers where neither GMP nor BCmath is available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "FG\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Friedrich Große", + "email": "friedrich.grosse@gmail.com", + "homepage": "https://github.com/FGrosse", + "role": "Author" + }, + { + "name": "All contributors", + "homepage": "https://github.com/FGrosse/PHPASN1/contributors" + } + ], + "description": "A PHP Framework that allows you to encode and decode arbitrary ASN.1 structures using the ITU-T X.690 Encoding Rules.", + "homepage": "https://github.com/FGrosse/PHPASN1", + "keywords": [ + "DER", + "asn.1", + "asn1", + "ber", + "binary", + "decoding", + "encoding", + "x.509", + "x.690", + "x509", + "x690" + ], + "support": { + "issues": "https://github.com/fgrosse/PHPASN1/issues", + "source": "https://github.com/fgrosse/PHPASN1/tree/v2.4.0" + }, + "time": "2021-12-11T12:41:06+00:00" + }, + { + "name": "filp/whoops", + "version": "2.14.6", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "f7948baaa0330277c729714910336383286305da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da", + "reference": "f7948baaa0330277c729714910336383286305da", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.14.6" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2022-11-02T16:23:29+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.13.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a6232229a8309e8811dc751c28b91cb34b2943e1", + "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1", + "shasum": "" + }, + "require": { + "composer/semver": "^3.2", + "composer/xdebug-handler": "^3.0.3", + "doctrine/annotations": "^1.13", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0", + "symfony/console": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/options-resolver": "^5.4 || ^6.0", + "symfony/polyfill-mbstring": "^1.23", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php81": "^1.25", + "symfony/process": "^5.4 || ^6.0", + "symfony/stopwatch": "^5.4 || ^6.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.0", + "mikey179/vfsstream": "^1.6.10", + "php-coveralls/php-coveralls": "^2.5.2", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.15", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "phpunitgoodpractices/polyfill": "^1.6", + "phpunitgoodpractices/traits": "^1.9.2", + "symfony/phpunit-bridge": "^6.0", + "symfony/yaml": "^5.4 || ^6.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.13.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2022-10-31T19:28:50+00:00" + }, + { + "name": "fruitcake/laravel-cors", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/laravel-cors.git", + "reference": "7c036ec08972d8d5d9db637e772af6887828faf5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/7c036ec08972d8d5d9db637e772af6887828faf5", + "reference": "7c036ec08972d8d5d9db637e772af6887828faf5", + "shasum": "" + }, + "require": { + "fruitcake/php-cors": "^1.2", + "illuminate/contracts": "^6|^7|^8|^9", + "illuminate/support": "^6|^7|^8|^9", + "php": "^7.4|^8.0" + }, + "require-dev": { + "laravel/framework": "^6|^7.24|^8", + "orchestra/testbench-dusk": "^4|^5|^6|^7", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "laravel": { + "providers": [ + "Fruitcake\\Cors\\CorsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", + "keywords": [ + "api", + "cors", + "crossdomain", + "laravel" + ], + "support": { + "issues": "https://github.com/fruitcake/laravel-cors/issues", + "source": "https://github.com/fruitcake/laravel-cors/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-02-23T14:53:22+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-02-20T15:07:15+00:00" + }, + { + "name": "google/recaptcha", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/google/recaptcha.git", + "reference": "614f25a9038be4f3f2da7cbfd778dc5b357d2419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/google/recaptcha/zipball/614f25a9038be4f3f2da7cbfd778dc5b357d2419", + "reference": "614f25a9038be4f3f2da7cbfd778dc5b357d2419", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.2.20|^2.15", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^4.8.36|^5.7.27|^6.59|^7.5.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ReCaptcha\\": "src/ReCaptcha" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", + "homepage": "https://www.google.com/recaptcha/", + "keywords": [ + "Abuse", + "captcha", + "recaptcha", + "spam" + ], + "support": { + "forum": "https://groups.google.com/forum/#!forum/recaptcha", + "issues": "https://github.com/google/recaptcha/issues", + "source": "https://github.com/google/recaptcha" + }, + "time": "2020-03-31T17:50:54+00:00" + }, + { + "name": "graham-campbell/analyzer", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Analyzer.git", + "reference": "cfeae1d6d451be116d7d6f2f46b609bbb01063b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Analyzer/zipball/cfeae1d6d451be116d7d6f2f46b609bbb01063b7", + "reference": "cfeae1d6d451be116d7d6f2f46b609bbb01063b7", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.13", + "php": "^7.4.15 || ^8.0.2", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/reflection-docblock": "^5.3", + "phpdocumentor/type-resolver": "^1.6" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "phpunit/phpunit": "Required to use the analysis trait." + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\Analyzer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Checks if referenced classes really exist.", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "analysis", + "analyzer", + "classes", + "testing" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Analyzer/issues", + "source": "https://github.com/GrahamCampbell/Analyzer/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/analyzer", + "type": "tidelift" + } + ], + "time": "2022-02-07T10:57:51+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8", + "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.28 || ^9.5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2022-07-30T15:56:11+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-08-28T15:39:27+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "67c26b443f348a51926030c83481b85718457d3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-10-26T14:07:24+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7||^2.0", + "php": ">=7.3", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" + }, + "time": "2021-07-21T13:50:14+00:00" + }, + { + "name": "huddledigital/zendesk-laravel", + "version": "v3.7", + "source": { + "type": "git", + "url": "https://github.com/huddledigital/zendesk-laravel.git", + "reference": "068605b427111af4c5516ec9c3b3cc5a370efd0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/huddledigital/zendesk-laravel/zipball/068605b427111af4c5516ec9c3b3cc5a370efd0d", + "reference": "068605b427111af4c5516ec9c3b3cc5a370efd0d", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.4|^6.0|^7.0|^8.0|^9.0", + "php": ">=5.4.0", + "zendesk/zendesk_api_client_php": "2.*" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Huddle\\Zendesk\\Providers\\ZendeskServiceProvider" + ], + "aliases": { + "Zendesk": "Huddle\\Zendesk\\Facades\\Zendesk" + } + } + }, + "autoload": { + "psr-4": { + "Huddle\\Zendesk\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Huddle Digital Ltd", + "email": "info@workwithhuddle.com" + } + ], + "description": "Laravel wrapper for zendesk/zendesk_api_client_php package", + "homepage": "http://workwithhuddle.com", + "keywords": [ + "Zendesk" + ], + "support": { + "issues": "https://github.com/huddledigital/zendesk-laravel/issues", + "source": "https://github.com/huddledigital/zendesk-laravel/tree/v3.7" + }, + "time": "2022-02-07T12:03:38+00:00" + }, + { + "name": "intervention/image", + "version": "2.7.2", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "04be355f8d6734c826045d02a1079ad658322dad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad", + "reference": "04be355f8d6734c826045d02a1079ad658322dad", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1 || ^2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + }, + "laravel": { + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + } + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/2.7.2" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2022-05-21T17:30:32+00:00" + }, + { + "name": "jamesmills/laravel-timezone", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/jamesmills/laravel-timezone.git", + "reference": "40df97b57e546200ded36020bfe6ad88528aaa4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jamesmills/laravel-timezone/zipball/40df97b57e546200ded36020bfe6ad88528aaa4a", + "reference": "40df97b57e546200ded36020bfe6ad88528aaa4a", + "shasum": "" + }, + "require": { + "laravel/framework": "5.6.* || 5.7.* || 5.8.* || ^6 || ^7 || ^8 || ^9", + "nesbot/carbon": "^1.0 || ^2.0", + "php": ">=7.4", + "torann/geoip": "^3.0", + "treeware/plant": "dev-main" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.12" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "JamesMills\\LaravelTimezone\\LaravelTimezoneServiceProvider" + ] + }, + "treeware": { + "teaser": [ + "Your message to the consumers of your package to convince them.", + "Multiple lines are possible, but not more than 3 lines and 200 characters." + ], + "priceGroups": { + "useful": 100, + "important": 250, + "critical": 500 + } + } + }, + "autoload": { + "psr-4": { + "JamesMills\\LaravelTimezone\\": "src/", + "JamesMills\\LaravelTimezone\\Database\\Seeds\\": "database/seeds/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "James Mills", + "email": "james@clicksco.com" + } + ], + "description": "Timezone storage and retrieval for Laravel", + "keywords": [ + "laravel", + "timezone" + ], + "support": { + "issues": "https://github.com/jamesmills/laravel-timezone/issues", + "source": "https://github.com/jamesmills/laravel-timezone/tree/1.11.0" + }, + "time": "2022-02-16T04:54:03+00:00" + }, + { + "name": "jasonmccreary/laravel-test-assertions", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/jasonmccreary/laravel-test-assertions.git", + "reference": "2547c0366f1ee9a2d58b031468b26edc63faef4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jasonmccreary/laravel-test-assertions/zipball/2547c0366f1ee9a2d58b031468b26edc63faef4e", + "reference": "2547c0366f1ee9a2d58b031468b26edc63faef4e", + "shasum": "" + }, + "require": { + "illuminate/testing": "^8.0|^9.0", + "mockery/mockery": "^1.4.2", + "php": ">=7.3|^8.0", + "phpunit/phpunit": "^9.3.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "JMac\\Testing\\AdditionalAssertionsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "JMac\\Testing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jason McCreary", + "email": "jason@pureconcepts.net" + } + ], + "description": "A set of helpful assertions when testing Laravel applications.", + "support": { + "issues": "https://github.com/jasonmccreary/laravel-test-assertions/issues", + "source": "https://github.com/jasonmccreary/laravel-test-assertions/tree/v2.1.1" + }, + "time": "2022-03-08T14:47:39+00:00" + }, + { + "name": "jaybizzle/crawler-detect", + "version": "v1.2.112", + "source": { + "type": "git", + "url": "https://github.com/JayBizzle/Crawler-Detect.git", + "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f", + "reference": "2c555ce35a07a5c1c808cee7d5bb52c41a4c7b2f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Jaybizzle\\CrawlerDetect\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Beech", + "email": "m@rkbee.ch", + "role": "Developer" + } + ], + "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent", + "homepage": "https://github.com/JayBizzle/Crawler-Detect/", + "keywords": [ + "crawler", + "crawler detect", + "crawler detector", + "crawlerdetect", + "php crawler detect" + ], + "support": { + "issues": "https://github.com/JayBizzle/Crawler-Detect/issues", + "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.2.112" + }, + "time": "2022-10-05T21:52:44+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" + }, + "time": "2021-10-08T21:21:46+00:00" + }, + { + "name": "jenssegers/agent", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/jenssegers/agent.git", + "reference": "daa11c43729510b3700bc34d414664966b03bffe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jenssegers/agent/zipball/daa11c43729510b3700bc34d414664966b03bffe", + "reference": "daa11c43729510b3700bc34d414664966b03bffe", + "shasum": "" + }, + "require": { + "jaybizzle/crawler-detect": "^1.2", + "mobiledetect/mobiledetectlib": "^2.7.6", + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5.0|^6.0|^7.0" + }, + "suggest": { + "illuminate/support": "Required for laravel service providers" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "laravel": { + "providers": [ + "Jenssegers\\Agent\\AgentServiceProvider" + ], + "aliases": { + "Agent": "Jenssegers\\Agent\\Facades\\Agent" + } + } + }, + "autoload": { + "psr-4": { + "Jenssegers\\Agent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jens Segers", + "homepage": "https://jenssegers.com" + } + ], + "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect", + "homepage": "https://github.com/jenssegers/agent", + "keywords": [ + "Agent", + "browser", + "desktop", + "laravel", + "mobile", + "platform", + "user agent", + "useragent" + ], + "support": { + "issues": "https://github.com/jenssegers/agent/issues", + "source": "https://github.com/jenssegers/agent/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://github.com/jenssegers", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/jenssegers/agent", + "type": "tidelift" + } + ], + "time": "2020-06-13T08:05:20+00:00" + }, + { + "name": "jenssegers/optimus", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/jenssegers/optimus.git", + "reference": "a062ac06598e72a25a17ea6cba87f9e02d07b1bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jenssegers/optimus/zipball/a062ac06598e72a25a17ea6cba87f9e02d07b1bc", + "reference": "a062ac06598e72a25a17ea6cba87f9e02d07b1bc", + "shasum": "" + }, + "require": { + "php": "^7.4||^8.0", + "phpseclib/phpseclib": "^3.0", + "symfony/console": "^5.0||^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.10" + }, + "suggest": { + "ext-gmp": "Required for 32bit systems" + }, + "bin": [ + "bin/optimus" + ], + "type": "library", + "autoload": { + "psr-4": { + "Jenssegers\\Optimus\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jens Segers", + "homepage": "https://jenssegers.com" + } + ], + "description": "Id obfuscation based on Knuth's integer hash method", + "homepage": "https://github.com/jenssegers/optimus", + "keywords": [ + "hashids", + "id obfuscation", + "ids", + "obfuscation", + "optimus" + ], + "support": { + "issues": "https://github.com/jenssegers/optimus/issues", + "source": "https://github.com/jenssegers/optimus/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/jenssegers", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/jenssegers/optimus", + "type": "tidelift" + } + ], + "time": "2021-12-21T16:15:54+00:00" + }, + { + "name": "johnkary/phpunit-speedtrap", + "version": "v4.0.1", + "source": { + "type": "git", + "url": "https://github.com/johnkary/phpunit-speedtrap.git", + "reference": "d6600d2218396b78856c335f83479503957a5fa9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/johnkary/phpunit-speedtrap/zipball/d6600d2218396b78856c335f83479503957a5fa9", + "reference": "d6600d2218396b78856c335f83479503957a5fa9", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "JohnKary\\PHPUnit\\Listener\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Kary", + "email": "john@johnkary.net" + } + ], + "description": "Find and report on slow tests in your PHPUnit test suite", + "homepage": "https://github.com/johnkary/phpunit-speedtrap", + "keywords": [ + "phpunit", + "profile", + "slow" + ], + "support": { + "issues": "https://github.com/johnkary/phpunit-speedtrap/issues", + "source": "https://github.com/johnkary/phpunit-speedtrap/tree/v4.0.1" + }, + "time": "2022-10-17T00:56:56+00:00" + }, + { + "name": "laravel/fortify", + "version": "v1.13.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/fortify.git", + "reference": "28c2dc66639571ac656c13617a1a0876a82319b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/fortify/zipball/28c2dc66639571ac656c13617a1a0876a82319b1", + "reference": "28c2dc66639571ac656c13617a1a0876a82319b1", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0", + "ext-json": "*", + "illuminate/support": "^8.82|^9.0", + "php": "^7.3|^8.0", + "pragmarx/google2fa": "^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^6.0|^7.0", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Fortify\\FortifyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Fortify\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Backend controllers and scaffolding for Laravel authentication.", + "keywords": [ + "auth", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/fortify/issues", + "source": "https://github.com/laravel/fortify" + }, + "time": "2022-11-04T20:57:17+00:00" + }, + { + "name": "laravel/framework", + "version": "v9.41.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "cc902ce61b4ca08ca7449664cfab2fa96a1d1e28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/cc902ce61b4ca08ca7449664cfab2fa96a1d1e28", + "reference": "cc902ce61b4ca08ca7449664cfab2fa96a1d1e28", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1", + "ext-mbstring": "*", + "ext-openssl": "*", + "fruitcake/php-cors": "^1.2", + "laravel/serializable-closure": "^1.2.2", + "league/commonmark": "^2.2", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.62.1", + "nunomaduro/termwind": "^1.13", + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.2.2", + "symfony/console": "^6.0.9", + "symfony/error-handler": "^6.0", + "symfony/finder": "^6.0", + "symfony/http-foundation": "^6.0", + "symfony/http-kernel": "^6.0", + "symfony/mailer": "^6.0", + "symfony/mime": "^6.0", + "symfony/process": "^6.0", + "symfony/routing": "^6.0", + "symfony/uid": "^6.0", + "symfony/var-dumper": "^6.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^2.13.3|^3.1.4", + "fakerphp/faker": "^1.9.2", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^7.11", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^9.5.8", + "predis/predis": "^1.1.9|^2.0.2", + "symfony/cache": "^6.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "ext-bcmath": "Required to use the multiple_of validation rule.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-11-22T15:10:46+00:00" + }, + { + "name": "laravel/horizon", + "version": "v5.10.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/horizon.git", + "reference": "07a5d73b804c6ba17598e378057f4353c983fb3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/horizon/zipball/07a5d73b804c6ba17598e378057f4353c983fb3a", + "reference": "07a5d73b804c6ba17598e378057f4353c983fb3a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcntl": "*", + "ext-posix": "*", + "illuminate/contracts": "^8.17|^9.0", + "illuminate/queue": "^8.17|^9.0", + "illuminate/support": "^8.17|^9.0", + "nesbot/carbon": "^2.17", + "php": "^7.3|^8.0", + "ramsey/uuid": "^4.0", + "symfony/error-handler": "^5.0|^6.0", + "symfony/process": "^5.0|^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^6.0|^7.0", + "phpunit/phpunit": "^9.0", + "predis/predis": "^1.1|^2.0" + }, + "suggest": { + "ext-redis": "Required to use the Redis PHP driver.", + "predis/predis": "Required when not using the Redis PHP driver (^1.1|^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Horizon\\HorizonServiceProvider" + ], + "aliases": { + "Horizon": "Laravel\\Horizon\\Horizon" + } + } + }, + "autoload": { + "psr-4": { + "Laravel\\Horizon\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Dashboard and code-driven configuration for Laravel queues.", + "keywords": [ + "laravel", + "queue" + ], + "support": { + "issues": "https://github.com/laravel/horizon/issues", + "source": "https://github.com/laravel/horizon/tree/v5.10.4" + }, + "time": "2022-11-07T08:57:31+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae", + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2022-09-08T13:45:54+00:00" + }, + { + "name": "laravel/telescope", + "version": "v4.9.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/telescope.git", + "reference": "017eaf1b6d19392d196adcb4151bdf6d59612d66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/telescope/zipball/017eaf1b6d19392d196adcb4151bdf6d59612d66", + "reference": "017eaf1b6d19392d196adcb4151bdf6d59612d66", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^8.37|^9.0", + "php": "^7.3|^8.0", + "symfony/var-dumper": "^5.0|^6.0" + }, + "require-dev": { + "ext-gd": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "orchestra/testbench": "^6.0|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Telescope\\TelescopeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Telescope\\": "src/", + "Laravel\\Telescope\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mohamed Said", + "email": "mohamed@laravel.com" + } + ], + "description": "An elegant debug assistant for the Laravel framework.", + "keywords": [ + "debugging", + "laravel", + "monitoring" + ], + "support": { + "issues": "https://github.com/laravel/telescope/issues", + "source": "https://github.com/laravel/telescope/tree/v4.9.6" + }, + "time": "2022-11-08T07:00:35+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "5062061b4924af3392225dd482ca7b4d85d8b8ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/5062061b4924af3392225dd482ca7b4d85d8b8ef", + "reference": "5062061b4924af3392225dd482ca7b4d85d8b8ef", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.10.4|^0.11.1", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.7.3" + }, + "time": "2022-11-09T15:11:38+00:00" + }, + { + "name": "lastguest/murmurhash", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/lastguest/murmurhash-php.git", + "reference": "4fb7516f67e695e5d7fa129d1bbb925ec0ebe408" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lastguest/murmurhash-php/zipball/4fb7516f67e695e5d7fa129d1bbb925ec0ebe408", + "reference": "4fb7516f67e695e5d7fa129d1bbb925ec0ebe408", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpstan/phpstan": "^0.6.3", + "phpunit/phpunit": "^5" + }, + "type": "library", + "autoload": { + "psr-4": { + "lastguest\\": "src/lastguest/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stefano Azzolini", + "email": "lastguest@gmail.com", + "homepage": "https://github.com/lastguest/murmurhash-php" + } + ], + "description": "MurmurHash3 Hash", + "homepage": "https://github.com/lastguest/murmurhash-php", + "keywords": [ + "hash", + "hashing", + "murmur" + ], + "support": { + "issues": "https://github.com/lastguest/murmurhash-php/issues", + "source": "https://github.com/lastguest/murmurhash-php/tree/master" + }, + "time": "2017-10-10T15:16:12+00:00" + }, + { + "name": "league/commonmark", + "version": "2.3.7", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "a36bd2be4f5387c0f3a8792a0d76b7d68865abbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/a36bd2be4f5387c0f3a8792a0d76b7d68865abbf", + "reference": "a36bd2be4f5387c0f3a8792a0d76b7d68865abbf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2022-11-03T17:29:46+00:00" + }, + { + "name": "league/config", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.90", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2021-08-14T12:15:32+00:00" + }, + { + "name": "league/flysystem", + "version": "3.10.4", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "a7790f3dd1b27af81d380e6b2afa77c16ab7e181" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a7790f3dd1b27af81d380e6b2afa77c16ab7e181", + "reference": "a7790f3dd1b27af81d380e6b2afa77c16ab7e181", + "shasum": "" + }, + "require": { + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.1", + "aws/aws-sdk-php": "^3.198.1", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.10.4" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-11-26T19:48:01+00:00" + }, + { + "name": "league/glide", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/glide.git", + "reference": "bff5b0fe2fd26b2fde2d6958715fde313887d79d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/glide/zipball/bff5b0fe2fd26b2fde2d6958715fde313887d79d", + "reference": "bff5b0fe2fd26b2fde2d6958715fde313887d79d", + "shasum": "" + }, + "require": { + "intervention/image": "^2.7", + "league/flysystem": "^2.0|^3.0", + "php": "^7.2|^8.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "phpunit/php-token-stream": "^3.1|^4.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Glide\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "http://reinink.ca" + }, + { + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com", + "homepage": "https://titouangalopin.com" + } + ], + "description": "Wonderfully easy on-demand image manipulation library with an HTTP based API.", + "homepage": "http://glide.thephpleague.com", + "keywords": [ + "ImageMagick", + "editing", + "gd", + "image", + "imagick", + "league", + "manipulation", + "processing" + ], + "support": { + "issues": "https://github.com/thephpleague/glide/issues", + "source": "https://github.com/thephpleague/glide/tree/2.2.2" + }, + "time": "2022-02-21T07:40:55+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-04-17T13:12:02+00:00" + }, + { + "name": "livewire/livewire", + "version": "v2.10.7", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "fa0441bf82f1674beecb3a8ad8a4ae428736ed18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/fa0441bf82f1674beecb3a8ad8a4ae428736ed18", + "reference": "fa0441bf82f1674beecb3a8ad8a4ae428736ed18", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0|^9.0", + "illuminate/support": "^7.0|^8.0|^9.0", + "illuminate/validation": "^7.0|^8.0|^9.0", + "league/mime-type-detection": "^1.9", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0|^6.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0|^9.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0|^7.0", + "orchestra/testbench-dusk": "^5.2|^6.0|^7.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.10.7" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2022-08-08T13:52:53+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "2.2.6", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", + "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": "^7.4 || ^8.0", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.9", + "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5.8 || ^9.4.2", + "vimeo/psalm": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.6" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + }, + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2022-11-25T18:57:19+00:00" + }, + { + "name": "mdanter/ecc", + "version": "v0.5.2", + "source": { + "type": "git", + "url": "https://github.com/phpecc/phpecc.git", + "reference": "b95f25cc1bacc83a9f0ccd375900b7cfd343029e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpecc/phpecc/zipball/b95f25cc1bacc83a9f0ccd375900b7cfd343029e", + "reference": "b95f25cc1bacc83a9f0ccd375900b7cfd343029e", + "shasum": "" + }, + "require": { + "ext-gmp": "*", + "fgrosse/phpasn1": "^2.0", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0", + "squizlabs/php_codesniffer": "^2.0", + "symfony/yaml": "^2.6|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mdanter\\Ecc\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matyas Danter", + "homepage": "http://matejdanter.com/", + "role": "Author" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io", + "homepage": "http://aztech.io", + "role": "Maintainer" + }, + { + "name": "Thomas Kerin", + "email": "afk11@users.noreply.github.com", + "role": "Maintainer" + } + ], + "description": "PHP Elliptic Curve Cryptography library", + "homepage": "https://github.com/phpecc/phpecc", + "keywords": [ + "Diffie", + "ECDSA", + "Hellman", + "curve", + "ecdh", + "elliptic", + "nistp192", + "nistp224", + "nistp256", + "nistp384", + "nistp521", + "phpecc", + "secp256k1", + "secp256r1" + ], + "support": { + "issues": "https://github.com/phpecc/phpecc/issues", + "source": "https://github.com/phpecc/phpecc/tree/master" + }, + "time": "2018-12-03T18:17:01+00:00" + }, + { + "name": "mmucklo/inflect", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/mmucklo/inflect.git", + "reference": "b665bcd3d4c23b6aa1990b6405ff96dd437689e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mmucklo/inflect/zipball/b665bcd3d4c23b6aa1990b6405ff96dd437689e9", + "reference": "b665bcd3d4c23b6aa1990b6405ff96dd437689e9", + "shasum": "" + }, + "require": { + "php": ">=5.3.17" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Inflect": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sho Kuwamoto", + "email": "sho@kuwamoto.org" + }, + { + "name": "Matthew J. Mucklo", + "email": "mmucklo@gmail.com" + } + ], + "description": "inflect - a memoizing inflector for php", + "keywords": [ + "inflect", + "inflector", + "pluralize", + "singularize", + "urlify" + ], + "support": { + "issues": "https://github.com/mmucklo/inflect/issues", + "source": "https://github.com/mmucklo/inflect/tree/v0.3.0" + }, + "time": "2015-05-16T04:16:08+00:00" + }, + { + "name": "mobiledetect/mobiledetectlib", + "version": "2.8.41", + "source": { + "type": "git", + "url": "https://github.com/serbanghita/Mobile-Detect.git", + "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", + "reference": "fc9cccd4d3706d5a7537b562b59cc18f9e4c0cb1", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.35||~5.7" + }, + "type": "library", + "autoload": { + "psr-0": { + "Detection": "namespaced/" + }, + "classmap": [ + "Mobile_Detect.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "keywords": [ + "detect mobile devices", + "mobile", + "mobile detect", + "mobile detector", + "php mobile detect" + ], + "support": { + "issues": "https://github.com/serbanghita/Mobile-Detect/issues", + "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.41" + }, + "time": "2022-11-08T18:31:26+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.5.1" + }, + "time": "2022-09-07T15:32:08+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2022-07-24T11:55:47+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + }, + "time": "2021-06-14T00:11:39+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2022-08-04T09:53:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.63.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ad35dd71a6a212b98e4b87e97389b6fa85f0e347", + "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2022-10-30T18:34:28+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.3" + }, + "time": "2022-10-13T01:24:26+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.8", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.3" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.8" + }, + "time": "2022-09-12T23:36:20+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.15.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" + }, + "time": "2022-11-12T15:38:23+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v6.3.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/0f6349c3ed5dd28467087b08fb59384bb458a22b", + "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.14.5", + "php": "^8.0.0", + "symfony/console": "^6.0.2" + }, + "require-dev": { + "brianium/paratest": "^6.4.1", + "laravel/framework": "^9.26.1", + "laravel/pint": "^1.1.1", + "nunomaduro/larastan": "^1.0.3", + "nunomaduro/mock-final-classes": "^1.1.0", + "orchestra/testbench": "^7.7", + "phpunit/phpunit": "^9.5.23", + "spatie/ignition": "^1.4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "6.x-dev" + }, + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2022-09-29T12:29:49+00:00" + }, + { + "name": "nunomaduro/larastan", + "version": "2.2.9", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/larastan.git", + "reference": "333e7915b984ce6606175749430081a372ead37e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/333e7915b984ce6606175749430081a372ead37e", + "reference": "333e7915b984ce6606175749430081a372ead37e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9", + "illuminate/container": "^9", + "illuminate/contracts": "^9", + "illuminate/database": "^9", + "illuminate/http": "^9", + "illuminate/pipeline": "^9", + "illuminate/support": "^9", + "mockery/mockery": "^1.4.4", + "php": "^8.0.2", + "phpmyadmin/sql-parser": "^5.5", + "phpstan/phpstan": "^1.9.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13.2", + "orchestra/testbench": "^7.0.0", + "phpunit/phpunit": "^9.5.11" + }, + "suggest": { + "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" + }, + "type": "phpstan-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Larastan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "larastan", + "laravel", + "package", + "php", + "static analysis" + ], + "support": { + "issues": "https://github.com/nunomaduro/larastan/issues", + "source": "https://github.com/nunomaduro/larastan/tree/2.2.9" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/canvural", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2022-11-04T14:58:00+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.14.2", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "9a8218511eb1a0965629ff820dda25985440aefc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/9a8218511eb1a0965629ff820dda25985440aefc", + "reference": "9a8218511eb1a0965629ff820dda25985440aefc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.14.2" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2022-10-28T22:51:32+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "f734364e38a876a23be4d906a2a089e1315be18a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/f734364e38a876a23be4d906a2a089e1315be18a", + "reference": "f734364e38a876a23be4d906a2a089e1315be18a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "php-http/message-factory": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || 8.5 || 9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.5.1" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2022-06-22T07:13:36+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v7.14.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "717d97c9f8d256371c46659af2754f51accbfdce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/717d97c9f8d256371c46659af2754f51accbfdce", + "reference": "717d97c9f8d256371c46659af2754f51accbfdce", + "shasum": "" + }, + "require": { + "fakerphp/faker": "^1.9.2", + "laravel/framework": "^9.36", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^7.14", + "php": "^8.0", + "phpunit/phpunit": "^9.5.10", + "spatie/laravel-ray": "^1.28", + "symfony/process": "^6.0.9", + "symfony/yaml": "^6.0.9", + "vlucas/phpdotenv": "^5.4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v7.14.0" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2022-11-22T22:19:11+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v7.14.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "fb8c90c5f5cb9033e085e4fbf581093cd6e32862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/fb8c90c5f5cb9033e085e4fbf581093cd6e32862", + "reference": "fb8c90c5f5cb9033e085e4fbf581093cd6e32862", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "fakerphp/faker": "^1.9.2", + "laravel/framework": "^9.36", + "laravel/laravel": "9.x-dev", + "laravel/pint": "^1.1", + "mockery/mockery": "^1.5.1", + "orchestra/canvas": "^7.0", + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9.5.10", + "spatie/laravel-ray": "^1.28", + "symfony/process": "^6.0.9", + "symfony/yaml": "^6.0.9", + "vlucas/phpdotenv": "^5.4.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel tresting (^6.4).", + "fakerphp/faker": "Allow using Faker for testing (^1.9.2).", + "laravel/framework": "Required for testing (^9.34).", + "mockery/mockery": "Allow using Mockery for testing (^1.5.1).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^6.2).", + "orchestra/testbench-browser-kit": "Allow using legacy Laravel BrowserKit for testing (^7.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^7.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^9.5.10).", + "symfony/yaml": "Required for CLI Commander (^6.0.9).", + "vlucas/phpdotenv": "Required for CLI Commander (^5.4.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2022-11-22T09:06:48+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "pestphp/pest", + "version": "v1.22.2", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "339414e34842f9463f33641b00559d4bf227e478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/339414e34842f9463f33641b00559d4bf227e478", + "reference": "339414e34842f9463f33641b00559d4bf227e478", + "shasum": "" + }, + "require": { + "nunomaduro/collision": "^5.11.0|^6.3.0", + "pestphp/pest-plugin": "^1.1.0", + "php": "^7.3 || ^8.0", + "phpunit/phpunit": "^9.5.26" + }, + "require-dev": { + "illuminate/console": "^8.83.26", + "illuminate/support": "^8.83.26", + "laravel/dusk": "^6.25.2", + "pestphp/pest-dev-tools": "^1.0.0", + "pestphp/pest-plugin-parallel": "^1.2" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "pest": { + "plugins": [ + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Environment" + ] + }, + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v1.22.2" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/lukeraymonddowning", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/olivernybroe", + "type": "github" + }, + { + "url": "https://github.com/owenvoke", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2022-11-09T21:10:57+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "606c5f79c6a339b49838ffbee0151ca519efe378" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/606c5f79c6a339b49838ffbee0151ca519efe378", + "reference": "606c5f79c6a339b49838ffbee0151ca519efe378", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "pestphp/pest": "<1.0" + }, + "require-dev": { + "composer/composer": "^2.4.2", + "pestphp/pest": "^1.22.1", + "pestphp/pest-dev-tools": "^1.0.0" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2022-09-18T13:18:17+00:00" + }, + { + "name": "pestphp/pest-plugin-faker", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-faker.git", + "reference": "9d93419f1f47ffd856ee544317b2f9144a129044" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-faker/zipball/9d93419f1f47ffd856ee544317b2f9144a129044", + "reference": "9d93419f1f47ffd856ee544317b2f9144a129044", + "shasum": "" + }, + "require": { + "fakerphp/faker": "^1.9.1", + "pestphp/pest": "^1.0", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/Faker.php" + ], + "psr-4": { + "Pest\\Faker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Faker Plugin", + "keywords": [ + "faker", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-faker/tree/v1.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-01-03T15:42:35+00:00" + }, + { + "name": "pestphp/pest-plugin-laravel", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-laravel.git", + "reference": "561930875e0336441f93fbd120fd53a2a890a8f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/561930875e0336441f93fbd120fd53a2a890a8f5", + "reference": "561930875e0336441f93fbd120fd53a2a890a8f5", + "shasum": "" + }, + "require": { + "laravel/framework": "^7.30.6 || ^8.83.23 || ^9.30.1", + "pestphp/pest": "^1.22.1", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "orchestra/testbench": "^5.20.0 || ^6.25.0 || ^7.7.0", + "pestphp/pest-dev-tools": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Laravel Plugin", + "keywords": [ + "framework", + "laravel", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2022-09-18T13:04:53+00:00" + }, + { + "name": "pestphp/pest-plugin-livewire", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-livewire.git", + "reference": "30e259e57c18dd40402e7fd29d46344a6cb9ff03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-livewire/zipball/30e259e57c18dd40402e7fd29d46344a6cb9ff03", + "reference": "30e259e57c18dd40402e7fd29d46344a6cb9ff03", + "shasum": "" + }, + "require": { + "livewire/livewire": "^1.2|^2.0", + "pestphp/pest": "^1.0", + "php": "^7.3|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.4", + "pestphp/pest-dev-tools": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Livewire Plugin", + "keywords": [ + "framework", + "livewire", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-livewire/tree/v1.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-01-03T15:37:46+00:00" + }, + { + "name": "pestphp/pest-plugin-parallel", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-parallel.git", + "reference": "7ae93d4052d2f45c0a37ca34f5dea940fb28cf31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-parallel/zipball/7ae93d4052d2f45c0a37ca34f5dea940fb28cf31", + "reference": "7ae93d4052d2f45c0a37ca34f5dea940fb28cf31", + "shasum": "" + }, + "require": { + "brianium/paratest": "^6.4.2", + "pestphp/pest-plugin": "^1.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "laravel/framework": "<8.55", + "nunomaduro/collision": "<5.8", + "pestphp/pest": "<1.16" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.0", + "pestphp/pest": "1.x-dev", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-strict-rules": "^1.3", + "symfony/var-dumper": "^5.0 || ^6.0", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Parallel\\Plugin" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/Autoload.php", + "build/RunnerWorker.php", + "build/BaseRunner.php" + ], + "psr-4": { + "Pest\\Parallel\\": "src/" + }, + "exclude-from-classmap": [ + "ParaTest\\Runners\\PHPUnit\\Worker\\RunnerWorker", + "ParaTest\\Runners\\PHPUnit\\BaseRunner" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Parallel Plugin", + "keywords": [ + "framework", + "parallel", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-parallel/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/lukeraymonddowning", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/octoper", + "type": "github" + }, + { + "url": "https://github.com/olivernybroe", + "type": "github" + }, + { + "url": "https://github.com/owenvoke", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2022-07-06T08:38:19+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/45db684cd4e186dcdc2b9c06b22970fe123796c0", + "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.6.0" + }, + "time": "2022-09-29T09:59:43+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.14.3", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/31d8ee46d0215108df16a8527c7438e96a4d7735", + "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.14.3" + }, + "time": "2022-07-11T14:04:40+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "f640739f80dfa1152533976e3c112477f69274eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb", + "reference": "f640739f80dfa1152533976e3c112477f69274eb", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.3.0" + }, + "time": "2022-02-21T09:52:22+00:00" + }, + { + "name": "php-http/message", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/7886e647a30a966a1a8d1dad1845b71ca8678361", + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.1 || ^8.0", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "laminas/laminas-diactoros": "^2.0", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.13.0" + }, + "time": "2022-02-11T13:41:14+00:00" + }, + { + "name": "php-http/message-factory", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" + }, + "time": "2015-12-19T14:08:53+00:00" + }, + { + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" + }, + "time": "2022-10-14T12:47:21+00:00" + }, + { + "name": "phpmyadmin/sql-parser", + "version": "5.5.0", + "source": { + "type": "git", + "url": "https://github.com/phpmyadmin/sql-parser.git", + "reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/8ab99cd0007d880f49f5aa1807033dbfa21b1cb5", + "reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "symfony/polyfill-mbstring": "^1.3" + }, + "conflict": { + "phpmyadmin/motranslator": "<3.0" + }, + "require-dev": { + "phpmyadmin/coding-standard": "^3.0", + "phpmyadmin/motranslator": "^4.0 || ^5.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/php-code-coverage": "*", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.11", + "zumba/json-serializer": "^3.0" + }, + "suggest": { + "ext-mbstring": "For best performance", + "phpmyadmin/motranslator": "Translate messages to your favorite locale" + }, + "bin": [ + "bin/highlight-query", + "bin/lint-query", + "bin/tokenize-query" + ], + "type": "library", + "autoload": { + "psr-4": { + "PhpMyAdmin\\SqlParser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "The phpMyAdmin Team", + "email": "developers@phpmyadmin.net", + "homepage": "https://www.phpmyadmin.net/team/" + } + ], + "description": "A validating SQL lexer and parser with a focus on MySQL dialect.", + "homepage": "https://github.com/phpmyadmin/sql-parser", + "keywords": [ + "analysis", + "lexer", + "parser", + "sql" + ], + "support": { + "issues": "https://github.com/phpmyadmin/sql-parser/issues", + "source": "https://github.com/phpmyadmin/sql-parser" + }, + "time": "2021-12-09T04:31:52+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8", + "phpunit/phpunit": "^8.5.28 || ^9.5.21" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2022-07-30T15:51:26+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.17", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "dbc2307d5c69aeb22db136c52e91130d7f2ca761" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/dbc2307d5c69aeb22db136c52e91130d7f2ca761", + "reference": "dbc2307d5c69aeb22db136c52e91130d7f2ca761", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.17" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2022-10-24T10:51:50+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f06dbb052ddc394e7896fcd1cfcd533f9f6ace40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f06dbb052ddc394e7896fcd1cfcd533f9f6ace40", + "reference": "f06dbb052ddc394e7896fcd1cfcd533f9f6ace40", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.8.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.2.0" + }, + "time": "2022-10-17T12:59:16+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "d6fdf01c53978b6429f1393ba4afeca39cc68afa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d6fdf01c53978b6429f1393ba4afeca39cc68afa", + "reference": "d6fdf01c53978b6429f1393ba4afeca39cc68afa", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2022-11-10T09:56:11+00:00" + }, + { + "name": "phpstan/phpstan-deprecation-rules", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", + "reference": "e5ccafb0dd8d835dd65d8d7a1a0d2b1b75414682" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/e5ccafb0dd8d835dd65d8d7a1a0d2b1b75414682", + "reference": "e5ccafb0dd8d835dd65d8d7a1a0d2b1b75414682", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "phpstan/phpstan": "^1.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "support": { + "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.0.0" + }, + "time": "2021-09-23T11:02:21+00:00" + }, + { + "name": "phpstan/phpstan-strict-rules", + "version": "1.4.4", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-strict-rules.git", + "reference": "23e5f377ee6395a1a04842d3d6ed4bd25e7b44a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/23e5f377ee6395a1a04842d3d6ed4bd25e7b44a6", + "reference": "23e5f377ee6395a1a04842d3d6ed4bd25e7b44a6", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.8.6" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Extra strict and opinionated rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.4.4" + }, + "time": "2022-09-21T11:38:17+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.19", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.14", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-11-18T07:47:47+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.26", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2022-10-28T06:00:21+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "pleonasm/merkle-tree", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/pleonasm/merkle-tree.git", + "reference": "9ddc9d0a0e396750fada378f3aa90f6c02dd56a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pleonasm/merkle-tree/zipball/9ddc9d0a0e396750fada378f3aa90f6c02dd56a1", + "reference": "9ddc9d0a0e396750fada378f3aa90f6c02dd56a1", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "ext-xdebug": ">=2.2.0", + "phpunit/php-invoker": ">=1.0.0,<1.2.0", + "phpunit/phpunit": "3.7.19", + "satooshi/php-coveralls": "*@dev", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Pleo": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Matthew Nagi", + "email": "matthew.nagi@base-2.net" + } + ], + "description": "An implementation of a Merkle Tree in PHP", + "support": { + "issues": "https://github.com/pleonasm/merkle-tree/issues", + "source": "https://github.com/pleonasm/merkle-tree/tree/master" + }, + "time": "2013-05-22T20:46:20+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "v8.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1" + }, + "time": "2022-06-13T21:57:56+00:00" + }, + { + "name": "pragmarx/google2fa-laravel", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa-laravel.git", + "reference": "d8243b8f812472f1112716c5462157e0ec128fce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-laravel/zipball/d8243b8f812472f1112716c5462157e0ec128fce", + "reference": "d8243b8f812472f1112716c5462157e0ec128fce", + "shasum": "" + }, + "require": { + "laravel/framework": ">=5.4.36|^8.0|^9.0", + "php": ">=7.0", + "pragmarx/google2fa-qrcode": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "bacon/bacon-qr-code": "^2.0", + "orchestra/testbench": "3.4.*|3.5.*|3.6.*|3.7.*|4.*|5.*|6.*", + "phpunit/phpunit": "~5|~6|~7|~8|~9" + }, + "suggest": { + "bacon/bacon-qr-code": "Required to generate inline QR Codes.", + "pragmarx/recovery": "Generate recovery codes." + }, + "type": "library", + "extra": { + "component": "package", + "frameworks": [ + "Laravel" + ], + "branch-alias": { + "dev-master": "0.2-dev" + }, + "laravel": { + "providers": [ + "PragmaRX\\Google2FALaravel\\ServiceProvider" + ], + "aliases": { + "Google2FA": "PragmaRX\\Google2FALaravel\\Facade" + } + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FALaravel\\": "src/", + "PragmaRX\\Google2FALaravel\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "Authentication", + "Two Factor Authentication", + "google2fa", + "laravel" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa-laravel/issues", + "source": "https://github.com/antonioribeiro/google2fa-laravel/tree/v2.0.2" + }, + "time": "2022-03-08T18:03:04+00:00" + }, + { + "name": "pragmarx/google2fa-qrcode", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa-qrcode.git", + "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/ce4d8a729b6c93741c607cfb2217acfffb5bf76b", + "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "pragmarx/google2fa": ">=4.0" + }, + "require-dev": { + "bacon/bacon-qr-code": "^2.0", + "chillerlan/php-qrcode": "^1.0|^2.0|^3.0|^4.0", + "khanamiryan/qrcode-detector-decoder": "^1.0", + "phpunit/phpunit": "~4|~5|~6|~7|~8|~9" + }, + "suggest": { + "bacon/bacon-qr-code": "For QR Code generation, requires imagick", + "chillerlan/php-qrcode": "For QR Code generation" + }, + "type": "library", + "extra": { + "component": "package", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FAQRCode\\": "src/", + "PragmaRX\\Google2FAQRCode\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "QR Code package for Google2FA", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa", + "qr code", + "qrcode" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues", + "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.0" + }, + "time": "2021-08-15T12:53:48+00:00" + }, + { + "name": "predis/predis", + "version": "v1.1.10", + "source": { + "type": "git", + "url": "https://github.com/predis/predis.git", + "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/predis/predis/zipball/a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", + "reference": "a2fb02d738bedadcffdbb07efa3a5e7bd57f8d6e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-curl": "Allows access to Webdis when paired with phpiredis", + "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + }, + "type": "library", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net", + "role": "Creator & Maintainer" + }, + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" + } + ], + "description": "Flexible and feature-complete Redis client for PHP and HHVM", + "homepage": "http://github.com/predis/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "support": { + "issues": "https://github.com/predis/predis/issues", + "source": "https://github.com/predis/predis/tree/v1.1.10" + }, + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ], + "time": "2022-01-05T17:46:08+00:00" + }, + { + "name": "propaganistas/laravel-fakeid", + "version": "4.0.10", + "source": { + "type": "git", + "url": "https://github.com/Propaganistas/Laravel-FakeId.git", + "reference": "1dd1511b8c0555eacbeab8cd717bf5dd387efee3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Propaganistas/Laravel-FakeId/zipball/1dd1511b8c0555eacbeab8cd717bf5dd387efee3", + "reference": "1dd1511b8c0555eacbeab8cd717bf5dd387efee3", + "shasum": "" + }, + "require": { + "illuminate/config": "^6.0|^7.0|^8.0|^9.0", + "illuminate/container": "^6.0|^7.0|^8.0|^9.0", + "illuminate/routing": "^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "jenssegers/optimus": "^1.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "orchestra/testbench": "*", + "phpunit/phpunit": "*" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Propaganistas\\LaravelFakeId\\FakeIdServiceProvider" + ], + "aliases": { + "FakeId": "Propaganistas\\LaravelFakeId\\Facades\\FakeId" + } + } + }, + "autoload": { + "psr-4": { + "Propaganistas\\LaravelFakeId\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Propaganistas", + "email": "Propaganistas@users.noreply.github.com" + } + ], + "description": "Automatic ID obfuscation for Eloquent models.", + "keywords": [ + "fakeid", + "hashids", + "laravel", + "obfuscation", + "optimus" + ], + "support": { + "issues": "https://github.com/Propaganistas/Laravel-FakeId/issues", + "source": "https://github.com/Propaganistas/Laravel-FakeId/tree/4.0.10" + }, + "time": "2022-10-13T12:58:01+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "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.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.11.9", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "1acec99d6684a54ff92f8b548a4e41b566963778" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1acec99d6684a54ff92f8b548a4e41b566963778", + "reference": "1acec99d6684a54ff92f8b548a4e41b566963778", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.11.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.9" + }, + "time": "2022-11-06T15:29:46+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-10-10T03:01:02+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.6.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", + "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.6.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2022-11-05T23:03:38+00:00" + }, + { + "name": "rector/rector", + "version": "0.14.8", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "46ee9a173a2b2645ca92a75ffc17460139fa226e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/46ee9a173a2b2645ca92a75ffc17460139fa226e", + "reference": "46ee9a173a2b2645ca92a75ffc17460139fa226e", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.9.0" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-php-parser": "*", + "rector/rector-phpoffice": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.14-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/0.14.8" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2022-11-14T14:09:49+00:00" + }, + { + "name": "ruafozy/mersenne-twister", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/ruafozy/php-mersenne-twister.git", + "reference": "83ca113aa1e5f924d3b5f03679b1480063cc7d94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ruafozy/php-mersenne-twister/zipball/83ca113aa1e5f924d3b5f03679b1480063cc7d94", + "reference": "83ca113aa1e5f924d3b5f03679b1480063cc7d94", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.1.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/mersenne_twister.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Pure-PHP Mersenne Twister", + "homepage": "https://github.com/ruafozy/php-mersenne-twister", + "keywords": [ + "PRNG", + "mersenne", + "random" + ], + "support": { + "issues": "https://github.com/ruafozy/php-mersenne-twister/issues", + "source": "https://github.com/ruafozy/php-mersenne-twister/tree/master" + }, + "time": "2015-02-21T10:26:45+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-03T09:37:03+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-12T14:47:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "sentry/sdk", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "d0678fc7274dbb03046ed05cb24eb92945bedf8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/d0678fc7274dbb03046ed05cb24eb92945bedf8e", + "reference": "d0678fc7274dbb03046ed05cb24eb92945bedf8e", + "shasum": "" + }, + "require": { + "http-interop/http-factory-guzzle": "^1.0", + "sentry/sentry": "^3.9", + "symfony/http-client": "^4.3|^5.0|^6.0" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php-sdk/issues", + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.3.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2022-10-11T09:05:00+00:00" + }, + { + "name": "sentry/sentry", + "version": "3.12.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "4902f43640963ed45517fd7c1da7fdd5511bb304" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/4902f43640963ed45517fd7c1da7fdd5511bb304", + "reference": "4902f43640963ed45517fd7c1da7fdd5511bb304", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.8.4|^2.1.1", + "jean85/pretty-package-versions": "^1.5|^2.0.4", + "php": "^7.2|^8.0", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.11", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "psr/http-factory": "^1.0", + "psr/http-message-implementation": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", + "symfony/polyfill-php80": "^1.17" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.19|3.4.*", + "http-interop/http-factory-guzzle": "^1.0", + "monolog/monolog": "^1.6|^2.0|^3.0", + "nikic/php-parser": "^4.10.3", + "php-http/mock-client": "^1.3", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5.14|^9.4", + "symfony/phpunit-bridge": "^5.2|^6.0", + "vimeo/psalm": "^4.17" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/3.12.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2022-11-22T10:57:08+00:00" + }, + { + "name": "sentry/sentry-laravel", + "version": "2.14.2", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-laravel.git", + "reference": "4538ed31d77868dd3b6d72ad6e5e68b572beeb9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/4538ed31d77868dd3b6d72ad6e5e68b572beeb9f", + "reference": "4538ed31d77868dd3b6d72ad6e5e68b572beeb9f", + "shasum": "" + }, + "require": { + "illuminate/support": "5.0 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0", + "nyholm/psr7": "^1.0", + "php": "^7.2 | ^8.0", + "sentry/sdk": "^3.1", + "sentry/sentry": "^3.3", + "symfony/psr-http-message-bridge": "^1.0 | ^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.11", + "laravel/framework": "5.0 - 5.8 | ^6.0 | ^7.0 | ^8.0 | ^9.0", + "mockery/mockery": "^1.3", + "orchestra/testbench": "3.1 - 3.8 | ^4.7 | ^5.1 | ^6.0 | ^7.0", + "phpunit/phpunit": "^5.7 | ^6.5 | ^7.5 | ^8.4 | ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev", + "dev-0.x": "0.x-dev" + }, + "laravel": { + "providers": [ + "Sentry\\Laravel\\ServiceProvider", + "Sentry\\Laravel\\Tracing\\ServiceProvider" + ], + "aliases": { + "Sentry": "Sentry\\Laravel\\Facade" + } + } + }, + "autoload": { + "psr-0": { + "Sentry\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "Laravel SDK for Sentry (https://sentry.io)", + "homepage": "https://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "laravel", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-laravel/issues", + "source": "https://github.com/getsentry/sentry-laravel/tree/2.14.2" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2022-10-13T09:21:29+00:00" + }, + { + "name": "simplito/bigint-wrapper-php", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/simplito/bigint-wrapper-php.git", + "reference": "cf21ec76d33f103add487b3eadbd9f5033a25930" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplito/bigint-wrapper-php/zipball/cf21ec76d33f103add487b3eadbd9f5033a25930", + "reference": "cf21ec76d33f103add487b3eadbd9f5033a25930", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "BI\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Simplito Team", + "email": "s.smyczynski@simplito.com", + "homepage": "https://simplito.com" + } + ], + "description": "Common interface for php_gmp and php_bcmath modules", + "support": { + "issues": "https://github.com/simplito/bigint-wrapper-php/issues", + "source": "https://github.com/simplito/bigint-wrapper-php/tree/1.0.0" + }, + "time": "2018-02-27T12:38:08+00:00" + }, + { + "name": "simplito/bn-php", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/simplito/bn-php.git", + "reference": "189167f940cdb681288a967b0f4d66de81adcd97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplito/bn-php/zipball/189167f940cdb681288a967b0f4d66de81adcd97", + "reference": "189167f940cdb681288a967b0f4d66de81adcd97", + "shasum": "" + }, + "require": { + "simplito/bigint-wrapper-php": "~1.0.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "BN\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Simplito Team", + "email": "s.smyczynski@simplito.com", + "homepage": "https://simplito.com" + } + ], + "description": "Big number implementation compatible with bn.js", + "support": { + "issues": "https://github.com/simplito/bn-php/issues", + "source": "https://github.com/simplito/bn-php/tree/1.1.3" + }, + "time": "2022-08-12T18:58:14+00:00" + }, + { + "name": "simplito/elliptic-php", + "version": "1.0.10", + "source": { + "type": "git", + "url": "https://github.com/simplito/elliptic-php.git", + "reference": "a6228f480c729cf8efe2650a617c8500e981716d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplito/elliptic-php/zipball/a6228f480c729cf8efe2650a617c8500e981716d", + "reference": "a6228f480c729cf8efe2650a617c8500e981716d", + "shasum": "" + }, + "require": { + "ext-gmp": "*", + "simplito/bn-php": "~1.1.0" + }, + "require-dev": { + "phpbench/phpbench": "@dev", + "phpunit/phpunit": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Elliptic\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Simplito Team", + "email": "s.smyczynski@simplito.com", + "homepage": "https://simplito.com" + } + ], + "description": "Fast elliptic curve cryptography", + "homepage": "https://github.com/simplito/elliptic-php", + "keywords": [ + "Curve25519", + "ECDSA", + "Ed25519", + "EdDSA", + "cryptography", + "curve", + "curve25519-weier", + "ecc", + "ecdh", + "elliptic", + "nistp192", + "nistp224", + "nistp256", + "nistp384", + "nistp521", + "secp256k1" + ], + "support": { + "issues": "https://github.com/simplito/elliptic-php/issues", + "source": "https://github.com/simplito/elliptic-php/tree/1.0.10" + }, + "time": "2022-08-12T19:00:25+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/backtrace/issues", + "source": "https://github.com/spatie/backtrace/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2021-11-09T10:57:15+00:00" + }, + { + "name": "spatie/data-transfer-object", + "version": "3.9.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/data-transfer-object.git", + "reference": "1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8", + "reference": "1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "illuminate/collections": "^8.36", + "jetbrains/phpstorm-attributes": "^1.0", + "larapack/dd": "^1.1", + "phpunit/phpunit": "^9.5.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\DataTransferObject\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Roose", + "email": "brent@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Data transfer objects with batteries included", + "homepage": "https://github.com/spatie/data-transfer-object", + "keywords": [ + "data-transfer-object", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/data-transfer-object/issues", + "source": "https://github.com/spatie/data-transfer-object/tree/3.9.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "abandoned": "spatie/laravel-data", + "time": "2022-09-16T13:34:38+00:00" + }, + { + "name": "spatie/db-dumper", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/db-dumper.git", + "reference": "129b8254b2c9f10881a754a692bd9507b09a1893" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/129b8254b2c9f10881a754a692bd9507b09a1893", + "reference": "129b8254b2c9f10881a754a692bd9507b09a1893", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/process": "^5.0|^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\DbDumper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Dump databases", + "homepage": "https://github.com/spatie/db-dumper", + "keywords": [ + "database", + "db-dumper", + "dump", + "mysqldump", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/db-dumper/tree/3.3.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-09-01T20:20:26+00:00" + }, + { + "name": "spatie/image", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/image.git", + "reference": "c2dc137c52d17bf12aff94ad051370c0f106b322" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image/zipball/c2dc137c52d17bf12aff94ad051370c0f106b322", + "reference": "c2dc137c52d17bf12aff94ad051370c0f106b322", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "ext-json": "*", + "ext-mbstring": "*", + "league/glide": "^2.2.2", + "php": "^8.0", + "spatie/image-optimizer": "^1.1", + "spatie/temporary-directory": "^1.0|^2.0", + "symfony/process": "^3.0|^4.0|^5.0|^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "symfony/var-dumper": "^4.0|^5.0|^6.0", + "vimeo/psalm": "^4.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Manipulate images with an expressive API", + "homepage": "https://github.com/spatie/image", + "keywords": [ + "image", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/image/tree/2.2.4" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-08-09T10:18:57+00:00" + }, + { + "name": "spatie/image-optimizer", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/image-optimizer.git", + "reference": "6db75529cbf8fa84117046a9d513f277aead90a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/6db75529cbf8fa84117046a9d513f277aead90a0", + "reference": "6db75529cbf8fa84117046a9d513f277aead90a0", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.3|^8.0", + "psr/log": "^1.0 | ^2.0 | ^3.0", + "symfony/process": "^4.2|^5.0|^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.21|^9.4.4", + "symfony/var-dumper": "^4.2|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ImageOptimizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily optimize images using PHP", + "homepage": "https://github.com/spatie/image-optimizer", + "keywords": [ + "image-optimizer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image-optimizer/issues", + "source": "https://github.com/spatie/image-optimizer/tree/1.6.2" + }, + "time": "2021-12-21T10:08:05+00:00" + }, + { + "name": "spatie/laravel-activitylog", + "version": "4.7.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-activitylog.git", + "reference": "eee61436e2984119fd71fc338a45ec7d68e3b548" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/eee61436e2984119fd71fc338a45ec7d68e3b548", + "reference": "eee61436e2984119fd71fc338a45ec7d68e3b548", + "shasum": "" + }, + "require": { + "illuminate/config": "^8.0 || ^9.0", + "illuminate/database": "^8.69 || ^9.27", + "illuminate/support": "^8.0 || ^9.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.6.3" + }, + "require-dev": { + "ext-json": "*", + "orchestra/testbench": "^6.23 || ^7.0", + "pestphp/pest": "^1.20" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Activitylog\\ActivitylogServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Activitylog\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Tom Witkowski", + "email": "dev.gummibeer@gmail.com", + "homepage": "https://gummibeer.de", + "role": "Developer" + } + ], + "description": "A very simple activity logger to monitor the users of your website or application", + "homepage": "https://github.com/spatie/activitylog", + "keywords": [ + "activity", + "laravel", + "log", + "spatie", + "user" + ], + "support": { + "issues": "https://github.com/spatie/laravel-activitylog/issues", + "source": "https://github.com/spatie/laravel-activitylog/tree/4.7.2" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-11-14T12:16:46+00:00" + }, + { + "name": "spatie/laravel-backup", + "version": "8.1.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-backup.git", + "reference": "cf367fbe50ff3b1ae9a79638cc5ef66f3cc9c7fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/cf367fbe50ff3b1ae9a79638cc5ef66f3cc9c7fa", + "reference": "cf367fbe50ff3b1ae9a79638cc5ef66f3cc9c7fa", + "shasum": "" + }, + "require": { + "ext-zip": "^1.14.0", + "illuminate/console": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/events": "^9.0", + "illuminate/filesystem": "^9.0", + "illuminate/notifications": "^9.0", + "illuminate/support": "^9.0", + "league/flysystem": "^3.0", + "php": "^8.0", + "spatie/db-dumper": "^3.0", + "spatie/laravel-package-tools": "^1.6.2", + "spatie/laravel-signal-aware-command": "^1.2", + "spatie/temporary-directory": "^2.0", + "symfony/console": "^6.0", + "symfony/finder": "^6.0" + }, + "require-dev": { + "composer-runtime-api": "^2.0", + "ext-pcntl": "*", + "laravel/slack-notification-channel": "^2.4", + "league/flysystem-aws-s3-v3": "^2.0|^3.0", + "mockery/mockery": "^1.4", + "nunomaduro/larastan": "^2.1", + "orchestra/testbench": "^7.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1" + }, + "suggest": { + "laravel/slack-notification-channel": "Required for sending notifications via Slack" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Backup\\BackupServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Helpers/functions.php" + ], + "psr-4": { + "Spatie\\Backup\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A Laravel package to backup your application", + "homepage": "https://github.com/spatie/laravel-backup", + "keywords": [ + "backup", + "database", + "laravel-backup", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-backup/issues", + "source": "https://github.com/spatie/laravel-backup/tree/8.1.5" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2022-10-19T13:01:58+00:00" + }, + { + "name": "spatie/laravel-flash", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-flash.git", + "reference": "4bdb9b46b1b4604a2a67e2c6be915557905c31ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-flash/zipball/4bdb9b46b1b4604a2a67e2c6be915557905c31ff", + "reference": "4bdb9b46b1b4604a2a67e2c6be915557905c31ff", + "shasum": "" + }, + "require": { + "illuminate/session": "^8.0|^9.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.23|^7.0", + "phpunit/phpunit": "^9.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Flash\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A lightweight package to flash messages", + "homepage": "https://github.com/spatie/laravel-flash", + "keywords": [ + "laravel-flash", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-flash/issues", + "source": "https://github.com/spatie/laravel-flash/tree/1.9.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2022-01-12T08:17:47+00:00" + }, + { + "name": "spatie/laravel-honeypot", + "version": "4.3.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-honeypot.git", + "reference": "8879f1952c1d8a733f9b9eab439340597bcfb1ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-honeypot/zipball/8879f1952c1d8a733f9b9eab439340597bcfb1ac", + "reference": "8879f1952c1d8a733f9b9eab439340597bcfb1ac", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0|^9.0", + "illuminate/encryption": "^8.0|^9.0", + "illuminate/http": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "illuminate/validation": "^8.0|^9.0", + "nesbot/carbon": "^2.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9", + "symfony/http-foundation": "^5.1.2|^6.0" + }, + "require-dev": { + "livewire/livewire": "^2.10", + "orchestra/testbench": "^6.23|^7.0", + "phpunit/phpunit": "^9.4", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Honeypot\\HoneypotServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Honeypot\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Preventing spam submitted through forms", + "homepage": "https://github.com/spatie/laravel-honeypot", + "keywords": [ + "laravel-honeypot", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/laravel-honeypot/tree/4.3.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2022-08-03T22:31:36+00:00" + }, + { + "name": "spatie/laravel-medialibrary", + "version": "10.7.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-medialibrary.git", + "reference": "40cf0c63286926f7357eb8136c0d2325cf33ba29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/40cf0c63286926f7357eb8136c0d2325cf33ba29", + "reference": "40cf0c63286926f7357eb8136c0d2325cf33ba29", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "ext-fileinfo": "*", + "ext-json": "*", + "illuminate/bus": "^9.18", + "illuminate/console": "^9.18", + "illuminate/database": "^9.18", + "illuminate/pipeline": "^9.18", + "illuminate/support": "^9.18", + "intervention/image": "^2.7", + "maennchen/zipstream-php": "^2.0", + "php": "^8.0", + "spatie/image": "^2.2.2", + "spatie/temporary-directory": "^2.0", + "symfony/console": "^6.0" + }, + "conflict": { + "php-ffmpeg/php-ffmpeg": "<0.6.1" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.133.11", + "doctrine/dbal": "^2.13", + "ext-imagick": "*", + "ext-pdo_sqlite": "*", + "ext-zip": "*", + "guzzlehttp/guzzle": "^7.4", + "league/flysystem-aws-s3-v3": "^3.0", + "mockery/mockery": "^1.4", + "nunomaduro/larastan": "^2.0", + "orchestra/testbench": "7.*", + "pestphp/pest": "^1.21", + "phpstan/extension-installer": "^1.1", + "spatie/laravel-ray": "^1.28", + "spatie/pdf-to-image": "^2.1", + "spatie/phpunit-snapshot-assertions": "^4.2" + }, + "suggest": { + "league/flysystem-aws-s3-v3": "Required to use AWS S3 file storage", + "php-ffmpeg/php-ffmpeg": "Required for generating video thumbnails", + "spatie/pdf-to-image": "Required for generating thumbsnails of PDFs and SVGs" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\MediaLibrary\\MediaLibraryServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\MediaLibrary\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Associate files with Eloquent models", + "homepage": "https://github.com/spatie/laravel-medialibrary", + "keywords": [ + "cms", + "conversion", + "downloads", + "images", + "laravel", + "laravel-medialibrary", + "media", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-medialibrary/issues", + "source": "https://github.com/spatie/laravel-medialibrary/tree/10.7.2" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-11-22T17:02:33+00:00" + }, + { + "name": "spatie/laravel-model-status", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-model-status.git", + "reference": "6380fa82ac98ab755b08a034d2c1608212e26478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-model-status/zipball/6380fa82ac98ab755b08a034d2c1608212e26478", + "reference": "6380fa82ac98ab755b08a034d2c1608212e26478", + "shasum": "" + }, + "require": { + "illuminate/support": "^8.71|^9.0", + "php": "^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.23|^7.0", + "phpunit/phpunit": "^9.4" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\ModelStatus\\ModelStatusServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\ModelStatus\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thomas Verhelst", + "email": "tvke91@gmail.com", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A package to enable assigning statuses to Eloquent Models", + "homepage": "https://github.com/spatie/laravel-model-status", + "keywords": [ + "laravel-status", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-model-status/issues", + "source": "https://github.com/spatie/laravel-model-status/tree/1.11.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2022-02-03T07:36:04+00:00" + }, + { + "name": "spatie/laravel-newsletter", + "version": "4.11.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-newsletter.git", + "reference": "25e456abecaba25e20d1c11e934bdc3f89601245" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-newsletter/zipball/25e456abecaba25e20d1c11e934bdc3f89601245", + "reference": "25e456abecaba25e20d1c11e934bdc3f89601245", + "shasum": "" + }, + "require": { + "drewm/mailchimp-api": "^2.4", + "illuminate/support": "^8.0|^9.0", + "php": "^7.3|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Newsletter\\NewsletterServiceProvider" + ], + "aliases": { + "Newsletter": "Spatie\\Newsletter\\NewsletterFacade" + } + } + }, + "autoload": { + "psr-4": { + "Spatie\\Newsletter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Manage newsletters in Laravel", + "homepage": "https://github.com/spatie/laravel-newsletter", + "keywords": [ + "laravel", + "mailchimp", + "newsletter" + ], + "support": { + "issues": "https://github.com/spatie/laravel-newsletter/issues", + "source": "https://github.com/spatie/laravel-newsletter/tree/4.11.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2022-01-14T07:31:45+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.13.7", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "4af8e608184471b5568af6265ebb0ca0025c131a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/4af8e608184471b5568af6265ebb0ca0025c131a", + "reference": "4af8e608184471b5568af6265ebb0ca0025c131a", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.28", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.5.24", + "spatie/pest-plugin-test-time": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.13.7" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-11-15T09:10:09+00:00" + }, + { + "name": "spatie/laravel-personal-data-export", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-personal-data-export.git", + "reference": "49db4b7617e32e94027784c358f426b994560d4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-personal-data-export/zipball/49db4b7617e32e94027784c358f426b994560d4b", + "reference": "49db4b7617e32e94027784c358f426b994560d4b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-zip": "*", + "illuminate/filesystem": "^9.0", + "illuminate/queue": "^9.0", + "illuminate/support": "^9.0", + "nesbot/carbon": "^2.14", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9", + "spatie/temporary-directory": "^2.0" + }, + "require-dev": { + "laravel/legacy-factories": "^1.0.4", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^7.0", + "spatie/invade": "^1.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\PersonalDataExport\\PersonalDataExportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\PersonalDataExport\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Create personal data downloads in a Laravel app", + "homepage": "https://github.com/spatie/laravel-personal-data-export", + "keywords": [ + "gdpr", + "personal", + "personal-data-export", + "spatie", + "zip" + ], + "support": { + "issues": "https://github.com/spatie/laravel-personal-data-export/issues", + "source": "https://github.com/spatie/laravel-personal-data-export/tree/4.2.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2022-07-06T16:39:04+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.31.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "7394694afd89d05879e7a69c54abab73c1199acd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/7394694afd89d05879e7a69c54abab73c1199acd", + "reference": "7394694afd89d05879e7a69c54abab73c1199acd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19|^9.0", + "illuminate/database": "^7.20|^8.19|^9.0", + "illuminate/queue": "^7.20|^8.19|^9.0", + "illuminate/support": "^7.20|^8.19|^9.0", + "php": "^7.3|^8.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.33", + "symfony/stopwatch": "4.2|^5.1|^6.0", + "zbateson/mail-mime-parser": "^1.3.1|^2.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20|^8.19|^9.0", + "orchestra/testbench-core": "^5.0|^6.0|^7.0", + "phpstan/phpstan": "^0.12.93", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.29.x-dev" + }, + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.31.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2022-09-20T13:13:22+00:00" + }, + { + "name": "spatie/laravel-responsecache", + "version": "7.4.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-responsecache.git", + "reference": "48cb5af1d80e023761ac4c93963cfc7d5adaa38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-responsecache/zipball/48cb5af1d80e023761ac4c93963cfc7d5adaa38b", + "reference": "48cb5af1d80e023761ac4c93963cfc7d5adaa38b", + "shasum": "" + }, + "require": { + "illuminate/cache": "^8.71|^9.0", + "illuminate/console": "^8.71|^9.0", + "illuminate/container": "^8.71|^9.0", + "illuminate/http": "^8.71|^9.0", + "illuminate/support": "^8.71|^9.0", + "nesbot/carbon": "^2.63", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9" + }, + "require-dev": { + "laravel/framework": "^9.0", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^6.23|^7.0", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.4" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\ResponseCache\\ResponseCacheServiceProvider" + ], + "aliases": { + "ResponseCache": "Spatie\\ResponseCache\\Facades\\ResponseCache" + } + } + }, + "autoload": { + "psr-4": { + "Spatie\\ResponseCache\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Speed up a Laravel application by caching the entire response", + "homepage": "https://github.com/spatie/laravel-responsecache", + "keywords": [ + "cache", + "laravel", + "laravel-responsecache", + "performance", + "response", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/laravel-responsecache/tree/7.4.4" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-11-25T08:07:24+00:00" + }, + { + "name": "spatie/laravel-schemaless-attributes", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-schemaless-attributes.git", + "reference": "3ac6d63f36c631edfafa5f34d7a3885f47b96e48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-schemaless-attributes/zipball/3ac6d63f36c631edfafa5f34d7a3885f47b96e48", + "reference": "3ac6d63f36c631edfafa5f34d7a3885f47b96e48", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0|^9.0", + "illuminate/database": "^7.0|^8.0|^9.0", + "illuminate/support": "^7.0|^8.0|^9.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.4.3" + }, + "require-dev": { + "brianium/paratest": "^6.2", + "mockery/mockery": "^1.4", + "nunomaduro/collision": "^5.3|^6.0", + "orchestra/testbench": "^6.15|^7.0", + "phpunit/phpunit": "^9.5.4" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\SchemalessAttributes\\SchemalessAttributesServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\SchemalessAttributes\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Add schemaless attributes to Eloquent models", + "homepage": "https://github.com/spatie/laravel-schemaless-attributes", + "keywords": [ + "laravel-schemaless-attributes", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-schemaless-attributes/issues", + "source": "https://github.com/spatie/laravel-schemaless-attributes/tree/2.3.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-01-12T08:21:28+00:00" + }, + { + "name": "spatie/laravel-signal-aware-command", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-signal-aware-command.git", + "reference": "d15a5b69bf715fc557b7034b4abd5a1472ae7ec8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-signal-aware-command/zipball/d15a5b69bf715fc557b7034b4abd5a1472ae7ec8", + "reference": "d15a5b69bf715fc557b7034b4abd5a1472ae7ec8", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.35|^9.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.4.3" + }, + "require-dev": { + "brianium/paratest": "^6.2", + "ext-pcntl": "*", + "nunomaduro/collision": "^5.3|^6.0", + "orchestra/testbench": "^6.16|^7.0", + "phpunit/phpunit": "^9.5", + "spatie/laravel-ray": "^1.17" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\SignalAwareCommand\\SignalAwareCommandServiceProvider" + ], + "aliases": { + "Signal": "Spatie\\SignalAwareCommand\\Facades\\Signal" + } + } + }, + "autoload": { + "psr-4": { + "Spatie\\SignalAwareCommand\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Handle signals in artisan commands", + "homepage": "https://github.com/spatie/laravel-signal-aware-command", + "keywords": [ + "laravel", + "laravel-signal-aware-command", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-signal-aware-command/issues", + "source": "https://github.com/spatie/laravel-signal-aware-command/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-01-12T19:42:44+00:00" + }, + { + "name": "spatie/laravel-sluggable", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-sluggable.git", + "reference": "e3b102ef0f0a0bfbba1eca5961a8e33207c76028" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-sluggable/zipball/e3b102ef0f0a0bfbba1eca5961a8e33207c76028", + "reference": "e3b102ef0f0a0bfbba1eca5961a8e33207c76028", + "shasum": "" + }, + "require": { + "illuminate/database": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "php": "^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.23|^7.0", + "pestphp/pest": "^1.20", + "spatie/laravel-translatable": "^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Sluggable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Generate slugs when saving Eloquent models", + "homepage": "https://github.com/spatie/laravel-sluggable", + "keywords": [ + "laravel-sluggable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-sluggable/issues", + "source": "https://github.com/spatie/laravel-sluggable/tree/3.4.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-03-28T11:21:33+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/pest-plugin-snapshots", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/pest-plugin-snapshots.git", + "reference": "7932ba9a44f9c5d010bcda4dc06ceb0474e13d6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/pest-plugin-snapshots/zipball/7932ba9a44f9c5d010bcda4dc06ceb0474e13d6d", + "reference": "7932ba9a44f9c5d010bcda4dc06ceb0474e13d6d", + "shasum": "" + }, + "require": { + "pestphp/pest": "^1.0", + "php": "^7.4 || ^8.0", + "spatie/phpunit-snapshot-assertions": "^4.2.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Spatie\\Snapshots\\Concerns\\": "./src/Concerns/" + }, + "exclude-from-classmap": [ + "../phpunit-snapshot-assertions/src/Concerns/SnapshotDirectoryAware.php", + "../phpunit-snapshot-assertions/src/Concerns/SnapshotIdAware.php", + "vendor/spatie/phpunit-snapshot-assertions/src/Concerns/SnapshotDirectoryAware.php", + "vendor/spatie/phpunit-snapshot-assertions/src/Concerns/SnapshotIdAware.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A package for snapshot testing in Pest", + "homepage": "https://github.com/spatie/pest-plugin-snapshots", + "keywords": [ + "pest", + "plugin", + "snapshots", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/pest-plugin-snapshots/issues", + "source": "https://github.com/spatie/pest-plugin-snapshots/tree/1.1.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-07-08T18:00:48+00:00" + }, + { + "name": "spatie/phpunit-snapshot-assertions", + "version": "4.2.16", + "source": { + "type": "git", + "url": "https://github.com/spatie/phpunit-snapshot-assertions.git", + "reference": "4c325139313c06b656ba10d5b60306c0de728c1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/phpunit-snapshot-assertions/zipball/4c325139313c06b656ba10d5b60306c0de728c1f", + "reference": "4c325139313c06b656ba10d5b60306c0de728c1f", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "php": "^7.3|^7.4|^8.0", + "phpunit/phpunit": "^8.3|^9.0", + "symfony/property-access": "^4.0|^5.0|^6.0", + "symfony/serializer": "^4.0|^5.0|^6.0", + "symfony/yaml": "^4.0|^5.0|^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Snapshots\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Snapshot testing with PHPUnit", + "homepage": "https://github.com/spatie/phpunit-snapshot-assertions", + "keywords": [ + "assert", + "phpunit", + "phpunit-snapshot-assertions", + "snapshot", + "spatie", + "testing" + ], + "support": { + "issues": "https://github.com/spatie/phpunit-snapshot-assertions/issues", + "source": "https://github.com/spatie/phpunit-snapshot-assertions/tree/4.2.16" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2022-10-10T15:58:50+00:00" + }, + { + "name": "spatie/ray", + "version": "1.36.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "4a4def8cda4806218341b8204c98375aa8c34323" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/4a4def8cda4806218341b8204c98375aa8c34323", + "reference": "4a4def8cda4806218341b8204c98375aa8c34323", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.3|^8.0", + "ramsey/uuid": "^3.0|^4.1", + "spatie/backtrace": "^1.1", + "spatie/macroable": "^1.0|^2.0", + "symfony/stopwatch": "^4.0|^5.1|^6.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0" + }, + "require-dev": { + "illuminate/support": "6.x|^8.18|^9.0", + "nesbot/carbon": "^2.43", + "phpstan/phpstan": "^0.12.92", + "phpunit/phpunit": "^9.5", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Ray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.36.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2022-08-11T14:04:18+00:00" + }, + { + "name": "spatie/regex", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/regex.git", + "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/regex/zipball/d543de2019a0068e7b80da0ba24f1c51c7469303", + "reference": "d543de2019a0068e7b80da0ba24f1c51c7469303", + "shasum": "" + }, + "require": { + "php": "^8.0|^8.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Regex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A sane interface for php's built in preg_* functions", + "homepage": "https://github.com/spatie/regex", + "keywords": [ + "expression", + "expressions", + "regex", + "regular", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/regex/issues", + "source": "https://github.com/spatie/regex/tree/3.1.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-11-30T21:13:59+00:00" + }, + { + "name": "spatie/temporary-directory", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "e2818d871783d520b319c2d38dc37c10ecdcde20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/e2818d871783d520b319c2d38dc37c10ecdcde20", + "reference": "e2818d871783d520b319c2d38dc37c10ecdcde20", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "php", + "spatie", + "temporary-directory" + ], + "support": { + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/2.1.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-08-23T07:15:15+00:00" + }, + { + "name": "spatie/yaml-front-matter", + "version": "2.0.7", + "source": { + "type": "git", + "url": "https://github.com/spatie/yaml-front-matter.git", + "reference": "f49f228994de70827ca857efffdd3bd7703aea34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/yaml-front-matter/zipball/f49f228994de70827ca857efffdd3bd7703aea34", + "reference": "f49f228994de70827ca857efffdd3bd7703aea34", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0", + "symfony/yaml": "^3.0|^4.0|^5.0|^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\YamlFrontMatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A to the point yaml front matter parser", + "homepage": "https://github.com/sebastiandedeyne/yaml-front-matter", + "keywords": [ + "front matter", + "jekyll", + "spatie", + "yaml" + ], + "support": { + "source": "https://github.com/spatie/yaml-front-matter/tree/2.0.7" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-04-06T12:03:55+00:00" + }, + { + "name": "staudenmeir/belongs-to-through", + "version": "v2.12.1", + "source": { + "type": "git", + "url": "https://github.com/staudenmeir/belongs-to-through.git", + "reference": "8316d274db603f63b16bb1c67379b0fa73209d98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staudenmeir/belongs-to-through/zipball/8316d274db603f63b16bb1c67379b0fa73209d98", + "reference": "8316d274db603f63b16bb1c67379b0fa73209d98", + "shasum": "" + }, + "require": { + "illuminate/database": "^9.0", + "php": "^8.0.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Znck\\Eloquent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rahul Kadyan", + "email": "hi@znck.me" + }, + { + "name": "Jonas Staudenmeir", + "email": "mail@jonas-staudenmeir.de" + } + ], + "description": "Laravel Eloquent BelongsToThrough relationships", + "support": { + "issues": "https://github.com/staudenmeir/belongs-to-through/issues", + "source": "https://github.com/staudenmeir/belongs-to-through/tree/v2.12.1" + }, + "funding": [ + { + "url": "https://paypal.me/JonasStaudenmeir", + "type": "custom" + } + ], + "time": "2022-03-10T21:14:19+00:00" + }, + { + "name": "symfony/console", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815", + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "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": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.1.7" + }, + "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": "2022-10-26T21:42:49+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.1.3" + }, + "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": "2022-06-27T17:24:16+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + }, + "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": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "699a26ce5ec656c198bf6e26398b0f0818c7e504" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/699a26ce5ec656c198bf6e26398b0f0818c7e504", + "reference": "699a26ce5ec656c198bf6e26398b0f0818c7e504", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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 to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.1.7" + }, + "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": "2022-10-28T16:23:08+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "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/v6.1.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": "2022-05-05T16:51:07+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", + "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "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.1.1" + }, + "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": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "4d216a2beef096edf040a070117c39ca2abce307" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307", + "reference": "4d216a2beef096edf040a070117c39ca2abce307", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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 basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.1.5" + }, + "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": "2022-09-21T20:29:40+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "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": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.1.3" + }, + "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": "2022-07-29T07:42:06+00:00" + }, + { + "name": "symfony/http-client", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "f515d066728774efb34347a87580621416ca8968" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/f515d066728774efb34347a87580621416ca8968", + "reference": "f515d066728774efb34347a87580621416ca8968", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/http-client-contracts": "^3", + "symfony/service-contracts": "^1.0|^2|^3" + }, + "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/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.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", + "support": { + "source": "https://github.com/symfony/http-client/tree/v6.1.7" + }, + "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": "2022-10-28T16:23:08+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "fd038f08c623ab5d22b26e9ba35afe8c79071800" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/fd038f08c623ab5d22b26e9ba35afe8c79071800", + "reference": "fd038f08c623ab5d22b26e9ba35afe8c79071800", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "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.1.1" + }, + "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": "2022-04-22T07:30:54+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "792a1856d2b95273f0e1c3435785f1d01a60ecc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/792a1856d2b95273f0e1c3435785f1d01a60ecc6", + "reference": "792a1856d2b95273f0e1c3435785f1d01a60ecc6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.1.7" + }, + "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": "2022-10-12T09:44:59+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "8fc1ffe753948c47a103a809cdd6a4a8458b3254" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8fc1ffe753948c47a103a809cdd6a4a8458b3254", + "reference": "8fc1ffe753948c47a103a809cdd6a4a8458b3254", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/error-handler": "^6.1", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.1", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.1", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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 a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.1.7" + }, + "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": "2022-10-28T18:06:36+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "7e19813c0b43387c55665780c4caea505cc48391" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/7e19813c0b43387c55665780c4caea505cc48391", + "reference": "7e19813c0b43387c55665780c4caea505cc48391", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<5.4" + }, + "require-dev": { + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/messenger": "^5.4|^6.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/v6.1.7" + }, + "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": "2022-10-28T16:23:08+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "f440f066d57691088d998d6e437ce98771144618" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/f440f066d57691088d998d6e437ce98771144618", + "reference": "f440f066d57691088d998d6e437ce98771144618", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "^5.2|^6.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/v6.1.7" + }, + "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": "2022-10-19T08:10:53+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", + "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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 an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.1.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": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "927013f3aac555983a5059aada98e1907d842695" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", + "reference": "927013f3aac555983a5059aada98e1907d842695", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "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": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/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.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "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": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292", + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "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": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.1.3" + }, + "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": "2022-06-27T17:24:16+00:00" + }, + { + "name": "symfony/property-access", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "cf034c0d8d25ed285bb8f6c2528ce6fac98563eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/cf034c0d8d25ed285bb8f6c2528ce6fac98563eb", + "reference": "cf034c0d8d25ed285bb8f6c2528ce6fac98563eb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/property-info": "^5.4|^6.0" + }, + "require-dev": { + "symfony/cache": "^5.4|^6.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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 functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v6.1.7" + }, + "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": "2022-10-28T16:23:08+00:00" + }, + { + "name": "symfony/property-info", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "b5a46ec66a4b77d4bd39d58c22710be888e55b68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/b5a46ec66a4b77d4bd39d58c22710be888e55b68", + "reference": "b5a46ec66a4b77d4bd39d58c22710be888e55b68", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/dependency-injection": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v6.1.7" + }, + "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": "2022-10-28T16:23:08+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "d444f85dddf65c7e57c58d8e5b3a4dbb593b1840" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/d444f85dddf65c7e57c58d8e5b3a4dbb593b1840", + "reference": "d444f85dddf65c7e57c58d8e5b3a4dbb593b1840", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0", + "symfony/config": "^4.4 || ^5.0 || ^6.0", + "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0", + "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", + "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.4@dev || ^6.0" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.3" + }, + "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": "2022-09-05T10:34:54+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "95effeb9d6e2cec861cee06bf5bbf82d09aea7f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/95effeb9d6e2cec861cee06bf5bbf82d09aea7f5", + "reference": "95effeb9d6e2cec861cee06bf5bbf82d09aea7f5", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.1.7" + }, + "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": "2022-10-18T13:12:43+00:00" + }, + { + "name": "symfony/serializer", + "version": "v6.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "76af774da9daf606d6400f1445b69d23efa3b238" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/76af774da9daf606d6400f1445b69d23efa3b238", + "reference": "76af774da9daf606d6400f1445b69d23efa3b238", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<5.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4", + "symfony/uid": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "symfony/cache": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/form": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0", + "symfony/var-exporter": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/property-info": "To deserialize relations.", + "symfony/var-exporter": "For using the metadata compiler.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v6.1.6" + }, + "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": "2022-10-12T05:10:31+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "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 writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" + }, + "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": "2022-05-30T19:18:58+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7", + "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.1.5" + }, + "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": "2022-09-28T16:00:52+00:00" + }, + { + "name": "symfony/string", + "version": "v6.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "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 an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.1.7" + }, + "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": "2022-10-10T09:34:31+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "e6cd330e5a072518f88d65148f3f165541807494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494", + "reference": "e6cd330e5a072518f88d65148f3f165541807494", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "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 to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.1.6" + }, + "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": "2022-10-07T08:04:03+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc", + "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "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 translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.1.1" + }, + "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": "2022-06-27T17:24:16+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "e03519f7b1ce1d3c0b74f751892bb41d549a2d98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/e03519f7b1ce1d3c0b74f751892bb41d549a2d98", + "reference": "e03519f7b1ce1d3c0b74f751892bb41d549a2d98", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.1.5" + }, + "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": "2022-09-09T09:34:27+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0f0adde127f24548e23cbde83bcaeadc491c551f", + "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "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 mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.1.6" + }, + "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": "2022-10-07T08:04:03+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "66c6b0cf52b00f74614a2cf7ae7db08ea1095931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/66c6b0cf52b00f74614a2cf7ae7db08ea1095931", + "reference": "66c6b0cf52b00f74614a2cf7ae7db08ea1095931", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.1.6" + }, + "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": "2022-10-07T08:04:03+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.5", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/4348a3a06651827a27d989ad1d13efec6bb49b19", + "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.5" + }, + "time": "2022-09-12T13:28:28+00:00" + }, + { + "name": "torann/geoip", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/Torann/laravel-geoip.git", + "reference": "3d730ae7470b86ae828b4128b1757a96156fd941" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Torann/laravel-geoip/zipball/3d730ae7470b86ae828b4128b1757a96156fd941", + "reference": "3d730ae7470b86ae828b4128b1757a96156fd941", + "shasum": "" + }, + "require": { + "illuminate/cache": "^8.0|^9.0", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "php": "^8.0" + }, + "require-dev": { + "geoip2/geoip2": "~2.1", + "mockery/mockery": "^1.3", + "phpstan/phpstan": "^0.12.14", + "phpunit/phpunit": "^8.0", + "squizlabs/php_codesniffer": "^3.5", + "vlucas/phpdotenv": "^5.0" + }, + "suggest": { + "geoip2/geoip2": "Required to use the MaxMind database or web service with GeoIP (~2.1).", + "monolog/monolog": "Allows for storing location not found errors to the log" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Torann\\GeoIP\\GeoIPServiceProvider" + ], + "aliases": { + "GeoIP": "Torann\\GeoIP\\Facades\\GeoIP" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Torann\\GeoIP\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Daniel Stainback", + "email": "torann@gmail.com" + } + ], + "description": "Support for multiple GeoIP services.", + "keywords": [ + "IP API", + "geoip", + "geolocation", + "infoDB", + "laravel", + "location", + "maxmind" + ], + "support": { + "issues": "https://github.com/Torann/laravel-geoip/issues", + "source": "https://github.com/Torann/laravel-geoip/tree/3.0.4" + }, + "time": "2022-02-09T14:48:24+00:00" + }, + { + "name": "treeware/plant", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/TreewareEarth/plant.git", + "reference": "72414a6a0ff8c9c522a12842ebc153939323ae9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TreewareEarth/plant/zipball/72414a6a0ff8c9c522a12842ebc153939323ae9c", + "reference": "72414a6a0ff8c9c522a12842ebc153939323ae9c", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0" + }, + "require-dev": { + "composer/composer": "^1.0|^2.0", + "pestphp/pest": "^1.0", + "phpstan/phpstan": "^0.12", + "spatie/pest-plugin-snapshots": "^1.0", + "symfony/console": "^5.1", + "symplify/easy-coding-standard": "^9.2" + }, + "default-branch": true, + "type": "composer-plugin", + "extra": { + "class": "Treeware\\Plant\\Plugin" + }, + "autoload": { + "psr-4": { + "Treeware\\Plant\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/TreewareEarth/plant/issues", + "source": "https://github.com/TreewareEarth/plant/tree/main" + }, + "time": "2021-05-04T19:10:49+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.5.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2022-10-16T01:01:54+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "295c7f82a8c44af685680d9df6714beb812e90ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/295c7f82a8c44af685680d9df6714beb812e90ff", + "reference": "295c7f82a8c44af685680d9df6714beb812e90ff", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=5.4", + "pimple/pimple": "^3.0", + "zbateson/mb-wrapper": "^1.0.1", + "zbateson/stream-decorators": "^1.0.6" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6.0", + "sanmai/phpunit-legacy-adapter": "^6.3 || ^8.2" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2022-09-28T16:31:49+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "5d9d190ef18ce6d424e3ac6f5ebe13901f92b74a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/5d9d190ef18ce6d424e3ac6f5ebe13901f92b74a", + "reference": "5d9d190ef18ce6d424e3ac6f5ebe13901f92b74a", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/1.1.2" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2022-05-26T15:55:05+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "8f8ca208572963258b7e6d91106181706deacd10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/8f8ca208572963258b7e6d91106181706deacd10", + "reference": "8f8ca208572963258b7e6d91106181706deacd10", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=5.4", + "zbateson/mb-wrapper": "^1.0.0" + }, + "require-dev": { + "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\StreamDecorators\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "PHP psr7 stream decorators for mime message part streams", + "keywords": [ + "base64", + "charset", + "decorators", + "mail", + "mime", + "psr7", + "quoted-printable", + "stream", + "uuencode" + ], + "support": { + "issues": "https://github.com/zbateson/stream-decorators/issues", + "source": "https://github.com/zbateson/stream-decorators/tree/1.0.7" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2022-09-08T15:44:55+00:00" + }, + { + "name": "zendesk/zendesk_api_client_php", + "version": "v2.2.15", + "source": { + "type": "git", + "url": "https://github.com/zendesk/zendesk_api_client_php.git", + "reference": "d1da1a7f1548dc5218e864cdf213532b0768d8c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendesk/zendesk_api_client_php/zipball/d1da1a7f1548dc5218e864cdf213532b0768d8c1", + "reference": "d1da1a7f1548dc5218e864cdf213532b0768d8c1", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "mmucklo/inflect": "0.3.*", + "php": ">=5.5.0" + }, + "require-dev": { + "fzaninotto/faker": ">=1.5.0", + "phpmd/phpmd": "@stable", + "phpunit/phpunit": "4.5.*", + "psy/psysh": "@stable", + "squizlabs/php_codesniffer": "2.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Zendesk\\API\\": "src/", + "Zendesk\\Console\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "PHP Client for Zendesk REST API. See https://developer.zendesk.com/rest_api/docs/core/introduction .", + "homepage": "https://github.com/zendesk/zendesk_api_client_php", + "support": { + "issues": "https://github.com/zendesk/zendesk_api_client_php/issues", + "source": "https://github.com/zendesk/zendesk_api_client_php/tree/v2.2.15" + }, + "time": "2022-06-20T05:20:31+00:00" + } + ], + "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "3372ed65e6d2039d663ed19aa699956f9d346271" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3372ed65e6d2039d663ed19aa699956f9d346271", + "reference": "3372ed65e6d2039d663ed19aa699956f9d346271", + "shasum": "" + }, + "require": { + "illuminate/routing": "^7|^8|^9", + "illuminate/session": "^7|^8|^9", + "illuminate/support": "^7|^8|^9", + "maximebf/debugbar": "^1.17.2", + "php": ">=7.2.5", + "symfony/finder": "^5|^6" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^5|^6|^7", + "phpunit/phpunit": "^8.5|^9.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.6-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ], + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-07-11T09:26:42+00:00" + }, + { + "name": "laravel/dusk", + "version": "v6.25.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/dusk.git", + "reference": "25a595ac3dc82089a91af10dd23b0d58fd3f6d0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/dusk/zipball/25a595ac3dc82089a91af10dd23b0d58fd3f6d0b", + "reference": "25a595ac3dc82089a91af10dd23b0d58fd3f6d0b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-zip": "*", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0", + "nesbot/carbon": "^2.0", + "php": "^7.2|^8.0", + "php-webdriver/webdriver": "^1.9.0", + "symfony/console": "^4.3|^5.0|^6.0", + "symfony/finder": "^4.3|^5.0|^6.0", + "symfony/process": "^4.3|^5.0|^6.0", + "vlucas/phpdotenv": "^3.0|^4.0|^5.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.16|^5.17.1|^6.12.1|^7.0", + "phpunit/phpunit": "^7.5.15|^8.4|^9.0" + }, + "suggest": { + "ext-pcntl": "Used to gracefully terminate Dusk when tests are running." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Dusk\\DuskServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Dusk\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Dusk provides simple end-to-end testing and browser automation.", + "keywords": [ + "laravel", + "testing", + "webdriver" + ], + "support": { + "issues": "https://github.com/laravel/dusk/issues", + "source": "https://github.com/laravel/dusk/tree/v6.25.2" + }, + "time": "2022-09-29T09:37:07+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.16.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "0dbee8802e17911afbe29a8506316343829b056e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/0dbee8802e17911afbe29a8506316343829b056e", + "reference": "0dbee8802e17911afbe29a8506316343829b056e", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0", + "illuminate/contracts": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "php": "^7.3|^8.0" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2022-11-21T16:19:18+00:00" + }, + { + "name": "maximebf/debugbar", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "ba0af68dd4316834701ecb30a00ce9604ced3ee9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/ba0af68dd4316834701ecb30a00ce9604ced3ee9", + "reference": "ba0af68dd4316834701ecb30a00ce9604ced3ee9", + "shasum": "" + }, + "require": { + "php": "^7.1|^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^2.6|^3|^4|^5|^6" + }, + "require-dev": { + "phpunit/phpunit": "^7.5.20 || ^9.4.2", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug", + "debugbar" + ], + "support": { + "issues": "https://github.com/maximebf/php-debugbar/issues", + "source": "https://github.com/maximebf/php-debugbar/tree/v1.18.1" + }, + "time": "2022-03-31T14:55:54+00:00" + }, + { + "name": "php-webdriver/webdriver", + "version": "1.13.1", + "source": { + "type": "git", + "url": "https://github.com/php-webdriver/php-webdriver.git", + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "php": "^5.6 || ~7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" + }, + "replace": { + "facebook/webdriver": "*" + }, + "require-dev": { + "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", + "php-coveralls/php-coveralls": "^2.4", + "php-mock/php-mock-phpunit": "^1.1 || ^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" + }, + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Exception/TimeoutException.php" + ], + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", + "homepage": "https://github.com/php-webdriver/php-webdriver", + "keywords": [ + "Chromedriver", + "geckodriver", + "php", + "selenium", + "webdriver" + ], + "support": { + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" + }, + "time": "2022-10-11T11:49:44+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "ebb9ae0509b75e02f128b39537eb9a3ef5ce18e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/ebb9ae0509b75e02f128b39537eb9a3ef5ce18e8", + "reference": "ebb9ae0509b75e02f128b39537eb9a3ef5ce18e8", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0", + "php": "^8.0", + "spatie/backtrace": "^1.2", + "symfony/http-foundation": "^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/process": "^5.2|^6.0", + "symfony/var-dumper": "^5.2|^6.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.3.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.3.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-11-16T08:30:20+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/dd3d456779108d7078baf4e43f8c2b937d9794a1", + "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "monolog/monolog": "^2.0", + "php": "^8.0", + "spatie/flare-client-php": "^1.1", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "symfony/process": "^5.4|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-08-26T11:51:15+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "2b79cf6ed40946b64ac6713d7d2da8a9d87f612b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/2b79cf6ed40946b64ac6713d7d2da8a9d87f612b", + "reference": "2b79cf6ed40946b64ac6713d7d2da8a9d87f612b", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^8.77|^9.27", + "monolog/monolog": "^2.3", + "php": "^8.0", + "spatie/flare-client-php": "^1.0.1", + "spatie/ignition": "^1.4.1", + "symfony/console": "^5.0|^6.0", + "symfony/var-dumper": "^5.0|^6.0" + }, + "require-dev": { + "filp/whoops": "^2.14", + "livewire/livewire": "^2.8|dev-develop", + "mockery/mockery": "^1.4", + "nunomaduro/larastan": "^1.0", + "orchestra/testbench": "^6.23|^7.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/laravel-ray": "^1.27" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-10-26T17:39:54+00:00" + }, + { + "name": "timacdonald/log-fake", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/timacdonald/log-fake.git", + "reference": "0abb5782c66e3ec01df46ed2062b31900fdb743a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/timacdonald/log-fake/zipball/0abb5782c66e3ec01df46ed2062b31900fdb743a", + "reference": "0abb5782c66e3ec01df46ed2062b31900fdb743a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/log": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0", + "phpunit/phpunit": "^9.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "illuminate/config": "^9.0", + "illuminate/container": "^9.0", + "symfony/var-dumper": "^6.0", + "timacdonald/callable-fake": "^1.5" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump and dd function (^6.0)." + }, + "type": "library", + "autoload": { + "psr-4": { + "TiMacDonald\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tim MacDonald", + "email": "hello@timacdonald.me", + "homepage": "https://timacdonald.me" + } + ], + "description": "A drop in fake logger for testing with the Laravel framework.", + "keywords": [ + "fake", + "laravel", + "log", + "logger", + "testing" + ], + "support": { + "docs": "https://github.com/timacdonald/log-fake/blob/master/readme.md", + "issues": "https://github.com/timacdonald/log-fake/issues", + "source": "https://github.com/timacdonald/log-fake/releases/latest" + }, + "time": "2022-05-08T07:06:45+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/config/activitylog.php b/config/activitylog.php new file mode 100644 index 0000000..77d473d --- /dev/null +++ b/config/activitylog.php @@ -0,0 +1,54 @@ + env('ACTIVITY_LOGGER_ENABLED', true), + + /* + * When the clean-command is executed, all recording activities older than + * the number of days specified here will be deleted. + */ + 'delete_records_older_than_days' => 365, + + /* + * If no log name is passed to the activity() helper + * we use this default log name. + */ + 'default_log_name' => 'default', + + /* + * You can specify an auth driver here that gets user models. + * If this is null we'll use the default Laravel auth driver. + */ + 'default_auth_driver' => null, + + /* + * If set to true, the subject returns soft deleted models. + */ + 'subject_returns_soft_deleted_models' => false, + + /* + * This model will be used to log activity. + * It should be implements the Spatie\Activitylog\Contracts\Activity interface + * and extend Illuminate\Database\Eloquent\Model. + */ + 'activity_model' => \Domain\Status\Models\Activity::class, + + /* + * This is the name of the table that will be created by the migration and + * used by the Activity model shipped with this package. + */ + 'table_name' => 'activity_log', + + /* + * This is the database connection that will be used by the migration and + * the Activity model shipped with this package. In case it's not set + * Laravel database.default will be used instead. + */ + 'database_connection' => env('ACTIVITY_LOGGER_DB_CONNECTION'), +]; diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..6fe6d06 --- /dev/null +++ b/config/app.php @@ -0,0 +1,264 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL', null), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\HorizonServiceProvider::class, + App\Providers\LivewireServiceProvider::class, + App\Providers\RouteServiceProvider::class, + App\Providers\ViewServiceProvider::class, + ARKEcosystem\Foundation\Providers\TelescopeServiceProvider::class, + + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => [ + + 'App' => Illuminate\Support\Facades\App::class, + 'Arr' => Illuminate\Support\Arr::class, + 'Artisan' => Illuminate\Support\Facades\Artisan::class, + 'Auth' => Illuminate\Support\Facades\Auth::class, + 'Blade' => Illuminate\Support\Facades\Blade::class, + 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, + 'Bus' => Illuminate\Support\Facades\Bus::class, + 'Cache' => Illuminate\Support\Facades\Cache::class, + 'Config' => Illuminate\Support\Facades\Config::class, + 'Cookie' => Illuminate\Support\Facades\Cookie::class, + 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'DB' => Illuminate\Support\Facades\DB::class, + 'Eloquent' => Illuminate\Database\Eloquent\Model::class, + 'Event' => Illuminate\Support\Facades\Event::class, + 'File' => Illuminate\Support\Facades\File::class, + 'Gate' => Illuminate\Support\Facades\Gate::class, + 'Hash' => Illuminate\Support\Facades\Hash::class, + 'Lang' => Illuminate\Support\Facades\Lang::class, + 'Log' => Illuminate\Support\Facades\Log::class, + 'Mail' => Illuminate\Support\Facades\Mail::class, + 'Notification' => Illuminate\Support\Facades\Notification::class, + 'Password' => Illuminate\Support\Facades\Password::class, + 'Queue' => Illuminate\Support\Facades\Queue::class, + 'Redirect' => Illuminate\Support\Facades\Redirect::class, + 'Redis' => Illuminate\Support\Facades\Redis::class, + 'Request' => Illuminate\Support\Facades\Request::class, + 'Response' => Illuminate\Support\Facades\Response::class, + 'Route' => Illuminate\Support\Facades\Route::class, + 'Schema' => Illuminate\Support\Facades\Schema::class, + 'Session' => Illuminate\Support\Facades\Session::class, + 'Storage' => Illuminate\Support\Facades\Storage::class, + 'Str' => Illuminate\Support\Str::class, + 'URL' => Illuminate\Support\Facades\URL::class, + 'Validator' => Illuminate\Support\Facades\Validator::class, + 'View' => Illuminate\Support\Facades\View::class, + + // Aliases for quick access in blade + 'ActivityDescriptionEnum' => ActivityDescriptionEnum::class, + 'AddressPrefixes' => AddressPrefixes::class, + 'Carbon' => Carbon::class, + 'NotificationFilterEnum' => NotificationFilterEnum::class, + 'DateFormat' => DateFormat::class, + 'Format' => Format::class, + 'NotificationBuilder' => NotificationBuilder::class, + 'PresetTypeEnum' => PresetTypeEnum::class, + 'ServerAttributeEnum' => ServerAttributeEnum::class, + 'ServerProviderTypeEnum' => ServerProviderTypeEnum::class, + 'TokenAttributeEnum' => TokenAttributeEnum::class, + 'User' => User::class, + 'NetworkTypeEnum' => NetworkTypeEnum::class, + 'TokenInvitationController' => TokenInvitationController::class, + 'LeaveTeamModal' => LeaveTeamModal::class, + 'Visitor' => ARKEcosystem\Foundation\Support\Facades\Visitor::class, + 'ServerDeploymentStatus' => Domain\Server\Enums\ServerDeploymentStatus::class, + ], +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..c3c554c --- /dev/null +++ b/config/auth.php @@ -0,0 +1,119 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + + 'api' => [ + 'driver' => 'token', + 'provider' => 'users', + 'hash' => false, + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => Domain\User\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that the reset token should be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_resets', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/config/aws.php b/config/aws.php new file mode 100644 index 0000000..2e582ff --- /dev/null +++ b/config/aws.php @@ -0,0 +1,25 @@ + env('AWS_REGION', 'us-east-1'), + 'version' => 'latest', + 'imageIds' => [ + 'ubuntu-18-04-lts' => 'ami-04b9e92b5572fa0d1', + ], +]; diff --git a/config/backup.php b/config/backup.php new file mode 100644 index 0000000..70c681c --- /dev/null +++ b/config/backup.php @@ -0,0 +1,233 @@ + [ + + /* + * The name of this application. You can use this name to monitor + * the backups. + */ + 'name' => env('APP_NAME', 'laravel-backup'), + + 'source' => [ + + 'files' => [ + + /* + * The list of directories and files that will be included in the backup. + */ + 'include' => [ + base_path(), + ], + + /* + * These directories and files will be excluded from the backup. + * + * Directories used by the backup process will automatically be excluded. + */ + 'exclude' => [ + base_path('vendor'), + base_path('node_modules'), + ], + + /* + * Determines if symlinks should be followed. + */ + 'follow_links' => false, + ], + + /* + * The names of the connections to the databases that should be backed up + * MySQL, PostgreSQL, SQLite and Mongo databases are supported. + * + * The content of the database dump may be customized for each connection + * by adding a 'dump' key to the connection settings in config/database.php. + * E.g. + * 'mysql' => [ + * ... + * 'dump' => [ + * 'excludeTables' => [ + * 'table_to_exclude_from_backup', + * 'another_table_to_exclude' + * ] + * ], + * ], + * + * If you are using only InnoDB tables on a MySQL server, you can + * also supply the useSingleTransaction option to avoid table locking. + * + * E.g. + * 'mysql' => [ + * ... + * 'dump' => [ + * 'useSingleTransaction' => true, + * ], + * ], + * + * For a complete list of available customization options, see https://github.com/spatie/db-dumper + */ + 'databases' => [ + env('DB_CONNECTION', 'pgsql'), + ], + ], + + /* + * The database dump can be compressed to decrease diskspace usage. + * + * Out of the box Laravel-backup supplies + * Spatie\DbDumper\Compressors\GzipCompressor::class. + * + * You can also create custom compressor. More info on that here: + * https://github.com/spatie/db-dumper#using-compression + * + * If you do not want any compressor at all, set it to null. + */ + 'database_dump_compressor' => null, + + 'destination' => [ + + /* + * The filename prefix used for the backup zip file. + */ + 'filename_prefix' => '', + + /* + * The disk names on which the backups will be stored. + */ + 'disks' => [ + 'local', + ], + ], + + /* + * The directory where the temporary files will be stored. + */ + 'temporary_directory' => storage_path('app/backup-temp'), + ], + + /* + * You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'. + * For Slack you need to install guzzlehttp/guzzle and laravel/slack-notification-channel. + * + * You can also use your own notification classes, just make sure the class is named after one of + * the `Spatie\Backup\Events` classes. + */ + 'notifications' => [ + + 'notifications' => [ + \Spatie\Backup\Notifications\Notifications\BackupHasFailed::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFound::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\CleanupHasFailed::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\BackupWasSuccessful::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\HealthyBackupWasFound::class => ['mail'], + \Spatie\Backup\Notifications\Notifications\CleanupWasSuccessful::class => ['mail'], + ], + + /* + * Here you can specify the notifiable to which the notifications should be sent. The default + * notifiable will use the variables specified in this config file. + */ + 'notifiable' => \Spatie\Backup\Notifications\Notifiable::class, + + 'mail' => [ + 'to' => 'your@example.com', + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + ], + + 'slack' => [ + 'webhook_url' => '', + + /* + * If this is set to null the default channel of the webhook will be used. + */ + 'channel' => null, + + 'username' => null, + + 'icon' => null, + + ], + ], + + /* + * Here you can specify which backups should be monitored. + * If a backup does not meet the specified requirements the + * UnHealthyBackupWasFound event will be fired. + */ + 'monitor_backups' => [ + [ + 'name' => env('APP_NAME', 'laravel-backup'), + 'disks' => ['local'], + 'health_checks' => [ + \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1, + \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000, + ], + ], + + /* + [ + 'name' => 'name of the second app', + 'disks' => ['local', 's3'], + 'health_checks' => [ + \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1, + \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000, + ], + ], + */ + ], + + 'cleanup' => [ + /* + * The strategy that will be used to cleanup old backups. The default strategy + * will keep all backups for a certain amount of days. After that period only + * a daily backup will be kept. After that period only weekly backups will + * be kept and so on. + * + * No matter how you configure it the default strategy will never + * delete the newest backup. + */ + 'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class, + + 'default_strategy' => [ + + /* + * The number of days for which backups must be kept. + */ + 'keep_all_backups_for_days' => 7, + + /* + * The number of days for which daily backups must be kept. + */ + 'keep_daily_backups_for_days' => 16, + + /* + * The number of weeks for which one weekly backup must be kept. + */ + 'keep_weekly_backups_for_weeks' => 8, + + /* + * The number of months for which one monthly backup must be kept. + */ + 'keep_monthly_backups_for_months' => 4, + + /* + * The number of years for which one yearly backup must be kept. + */ + 'keep_yearly_backups_for_years' => 2, + + /* + * After cleaning up the backups remove the oldest backup until + * this amount of megabytes has been reached. + */ + 'delete_oldest_backups_when_using_more_megabytes_than' => 5000, + ], + ], + +]; diff --git a/config/blade-icons.php b/config/blade-icons.php new file mode 100644 index 0000000..8ec4678 --- /dev/null +++ b/config/blade-icons.php @@ -0,0 +1,198 @@ + [ + + 'default' => [ + + /* + |----------------------------------------------------------------- + | Icons Path + |----------------------------------------------------------------- + | + | Provide the relative path from your app root to your SVG icons + | directory. Icons are loaded recursively so there's no need to + | list every sub-directory. + | + | Relative to the disk root when the disk option is set. + | + */ + + 'path' => 'vendor/arkecosystem/foundation/resources/assets/icons', + + /* + |----------------------------------------------------------------- + | Filesystem Disk + |----------------------------------------------------------------- + | + | Optionally, provide a specific filesystem disk to read + | icons from. When defining a disk, the "path" option + | starts relatively from the disk root. + | + */ + + 'disk' => '', + + /* + |----------------------------------------------------------------- + | Default Prefix + |----------------------------------------------------------------- + | + | This config option allows you to define a default prefix for + | your icons. The dash separator will be applied automatically + | to every icon name. It's required and needs to be unique. + | + */ + + 'prefix' => 'icon', + + /* + |----------------------------------------------------------------- + | Fallback Icon + |----------------------------------------------------------------- + | + | This config option allows you to define a fallback + | icon when an icon in this set cannot be found. + | + */ + + 'fallback' => 'question-mark-small', + + /* + |----------------------------------------------------------------- + | Default Set Classes + |----------------------------------------------------------------- + | + | This config option allows you to define some classes which + | will be applied by default to all icons within this set. + | + */ + + 'class' => 'fill-current', + + /* + |----------------------------------------------------------------- + | Default Set Attributes + |----------------------------------------------------------------- + | + | This config option allows you to define some attributes which + | will be applied by default to all icons within this set. + | + */ + + 'attributes' => [ + // 'width' => 50, + // 'height' => 50, + ], + + ], + + 'app' => [ + 'path' => 'resources/icons', + 'prefix' => 'app', + 'class' => '', + 'fallback' => 'question-mark-small', + ], + + 'fortify' => [ + 'path' => 'vendor/arkecosystem/foundation/resources/images', + 'prefix' => 'fortify', + 'class' => '', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global Default Classes + |-------------------------------------------------------------------------- + | + | This config option allows you to define some classes which + | will be applied by default to all icons. + | + */ + + 'class' => '', + + /* + |-------------------------------------------------------------------------- + | Global Default Attributes + |-------------------------------------------------------------------------- + | + | This config option allows you to define some attributes which + | will be applied by default to all icons. + | + */ + + 'attributes' => [ + // 'width' => 50, + // 'height' => 50, + ], + + /* + |-------------------------------------------------------------------------- + | Global Fallback Icon + |-------------------------------------------------------------------------- + | + | This config option allows you to define a global fallback + | icon when an icon in any set cannot be found. It can + | reference any icon from any configured set. + | + */ + + 'fallback' => '', + + /* + |-------------------------------------------------------------------------- + | Components + |-------------------------------------------------------------------------- + | + | These config options allow you to define some + | settings related to Blade Components. + | + */ + + 'components' => [ + + /* + |---------------------------------------------------------------------- + | Disable Components + |---------------------------------------------------------------------- + | + | This config option allows you to disable Blade components + | completely. It's useful to avoid performance problems + | when working with large icon libraries. + | + */ + + 'disabled' => false, + + /* + |---------------------------------------------------------------------- + | Default Icon Component Name + |---------------------------------------------------------------------- + | + | This config option allows you to define the name + | for the default Icon class component. + | + */ + + 'default' => 'icon', + + ], + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..47d6d1c --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,57 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'useTLS' => true, + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + ], +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..cb45512 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,106 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..733c51c --- /dev/null +++ b/config/cors.php @@ -0,0 +1,36 @@ + ['api/*'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => false, + + 'max_age' => false, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..162f070 --- /dev/null +++ b/config/database.php @@ -0,0 +1,143 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', 6379), + 'database' => env('REDIS_DB', 0), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', 6379), + 'database' => env('REDIS_CACHE_DB', 1), + ], + ], +]; diff --git a/config/debugbar.php b/config/debugbar.php new file mode 100644 index 0000000..cf77ad3 --- /dev/null +++ b/config/debugbar.php @@ -0,0 +1,204 @@ + env('DEBUGBAR_ENABLED', null), + 'except' => [ + 'telescope*', + ], + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | DebugBar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Redis and PDO + | can also be used. For PDO, run the package migrations first. + | + */ + 'storage' => [ + 'enabled' => true, + 'driver' => 'file', // redis, file, pdo, custom + 'path' => storage_path('debugbar'), // For file driver + 'connection' => null, // Leave null for default connection (Redis/PDO) + 'provider' => '', // Instance of StorageInterface for custom driver + ], + + /* + |-------------------------------------------------------------------------- + | Vendors + |-------------------------------------------------------------------------- + | + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) + | and for js: jquery and and highlight.js + | So if you want syntax highlighting, set it to true. + | jQuery is set to not conflict with existing jQuery scripts. + | + */ + + 'include_vendors' => true, + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. + */ + + 'capture_ajax' => true, + 'add_ajax_timing' => false, + + /* + |-------------------------------------------------------------------------- + | Custom Error Handler for Deprecated warnings + |-------------------------------------------------------------------------- + | + | When enabled, the Debugbar shows deprecated warnings for Symfony components + | in the Messages tab. + | + */ + 'error_handler' => false, + + /* + |-------------------------------------------------------------------------- + | Clockwork integration + |-------------------------------------------------------------------------- + | + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. + | + */ + 'clockwork' => false, + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => [ + 'phpinfo' => true, // Php version + 'messages' => true, // Messages + 'time' => true, // Time Datalogger + 'memory' => true, // Memory usage + 'exceptions' => false, // Exception displayer + 'log' => true, // Logs from Monolog (merged in messages if enabled) + 'db' => true, // Show database (PDO) queries and bindings + 'views' => true, // Views with their data + 'route' => false, // Current route information + 'auth' => false, // Display Laravel authentication status + 'gate' => true, // Display Laravel Gate checks + 'session' => true, // Display session data + 'symfony_request' => true, // Only one can be enabled.. + 'mail' => true, // Catch mail messages + 'laravel' => true, // Laravel version and environment + 'events' => false, // All events fired + 'default_request' => false, // Regular or special Symfony request logger + 'logs' => true, // Add the latest log messages + 'files' => false, // Show the included files + 'config' => false, // Display config settings + 'cache' => true, // Display cache events + 'models' => true, // Display models + ], + + /* + |-------------------------------------------------------------------------- + | Extra options + |-------------------------------------------------------------------------- + | + | Configure some DataCollectors + | + */ + + 'options' => [ + 'auth' => [ + 'show_name' => true, // Also show the users name/email in the debugbar + ], + 'db' => [ + 'with_params' => true, // Render SQL with the parameters substituted + 'backtrace' => true, // Use a backtrace to find the origin of the query in your files. + 'timeline' => true, // Add the queries to the timeline + 'explain' => [ // Show EXPLAIN output on queries + 'enabled' => false, + 'types' => ['SELECT'], // // workaround ['SELECT'] only. https://github.com/barryvdh/laravel-debugbar/issues/888 ['SELECT', 'INSERT', 'UPDATE', 'DELETE']; for MySQL 5.6.3+ + ], + 'hints' => true, // Show hints for common mistakes + ], + 'mail' => [ + 'full_log' => false, + ], + 'views' => [ + 'data' => false, //Note: Can slow down the application, because the data can be quite large.. + ], + 'route' => [ + 'label' => true, // show complete route on bar + ], + 'logs' => [ + 'file' => null, + ], + 'cache' => [ + 'values' => true, // collect cache values + ], + ], + + /* + |-------------------------------------------------------------------------- + | Inject Debugbar in Response + |-------------------------------------------------------------------------- + | + | Usually, the debugbar is added just before , by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html + | + */ + + 'inject' => true, + + /* + |-------------------------------------------------------------------------- + | DebugBar route prefix + |-------------------------------------------------------------------------- + | + | Sometimes you want to set route prefix to be used by DebugBar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | + */ + 'route_prefix' => '_debugbar', + + /* + |-------------------------------------------------------------------------- + | DebugBar route domain + |-------------------------------------------------------------------------- + | + | By default DebugBar route served from the same domain that request served. + | To override default domain, specify it as a non-empty value. + */ + 'route_domain' => null, +]; diff --git a/config/deployer.php b/config/deployer.php new file mode 100644 index 0000000..b4fb133 --- /dev/null +++ b/config/deployer.php @@ -0,0 +1,46 @@ + [ + 'length' => env('OPENSSH_KEY_LENGTH', 4096), + 'name' => env('OPENSSH_KEY_NAME', 'ark-deployer-temporary-key'), + ], + 'branch' => env('DEPLOYER_BRANCH', 'master'), + + /* + |-------------------------------------------------------------------------- + | Deployment Options + |-------------------------------------------------------------------------- + */ + 'deployment' => [ + 'minimumServerRam' => env('DEPLOYMENT_GENESIS_MIN_RAM', 2048), + 'minimumCores' => env('DEPLOYMENT_EXPLORER_MIN_CPU', 2), + ], + + /* + |-------------------------------------------------------------------------- + | Supported Server Providers + |-------------------------------------------------------------------------- + */ + 'server_providers' => [ + App\Enums\ServerProviderTypeEnum::DIGITALOCEAN => true, + App\Enums\ServerProviderTypeEnum::HETZNER => true, + // App\Enums\ServerProviderTypeEnum::VULTR => false, + // App\Enums\ServerProviderTypeEnum::AWS => false, + ], + + /* + |-------------------------------------------------------------------------- + | Wheter or not show the cookie consent pop up + |-------------------------------------------------------------------------- + */ + 'enable_cookieconsent' => env('ENABLE_COOKIECONSENT', true), +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..678d11b --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,111 @@ + env('FILESYSTEM_DRIVER', 'local'), + + /* + |-------------------------------------------------------------------------- + | Default Cloud Filesystem Disk + |-------------------------------------------------------------------------- + | + | Many applications store files both locally and in the cloud. For this + | reason, you may specify a default "cloud" driver here. This driver + | will be bound as the Cloud disk implementation in the container. + | + */ + + 'cloud' => env('FILESYSTEM_CLOUD', 's3'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + ], + + 'media' => [ + 'driver' => 'local', + 'root' => public_path('media'), + ], + + 'token-config' => [ + 'driver' => 'local', + 'root' => storage_path('token-config'), + ], + + 'personal-data-exports' => [ + 'driver' => 'local', + 'root' => storage_path('app/personal-data-exports'), + ], + + // Livewire added a temporary file upload disk configuration. + // See https://github.com/livewire/livewire/pull/2571 + // But even with this configuration applied, we got an error. + // The solution is to set the test disk used by Livewire with the default disk. + // See https://github.com/livewire/livewire/issues/1341 + 'tmp-for-tests' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/fortify.php b/config/fortify.php new file mode 100644 index 0000000..0f38f8b --- /dev/null +++ b/config/fortify.php @@ -0,0 +1,133 @@ + 'web', + + /* + |-------------------------------------------------------------------------- + | Fortify Password Broker + |-------------------------------------------------------------------------- + | + | Here you may specify which password broker Fortify can use when a user + | is resetting their password. This configured value should match one + | of your password brokers setup in your "auth" configuration file. + | + */ + + 'passwords' => 'users', + + /* + |-------------------------------------------------------------------------- + | Username / Email + |-------------------------------------------------------------------------- + | + | This value defines which model attribute should be considered as your + | application's "username" field. Typically, this might be the email + | address of the users but you are free to change this value here. + | + | Out of the box, Fortify expects forgot password and reset password + | requests to have a field named 'email'. If the application uses + | another name for the field you may define it below as needed. + | + */ + + 'username' => 'email', + + 'username_alt' => null, + + 'email' => 'email', + + /* + |-------------------------------------------------------------------------- + | Home Path + |-------------------------------------------------------------------------- + | + | Here you may configure the path where users will get redirected during + | authentication or password reset when the operations are successful + | and the user is authenticated. You are free to change this value. + | + */ + + 'home' => RouteServiceProvider::HOME, + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Middleware + |-------------------------------------------------------------------------- + | + | Here you may specify which middleware Fortify will assign to the routes + | that it registers with the application. If necessary, you may change + | these middleware but typically this provided default is preferred. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Rate Limiting + |-------------------------------------------------------------------------- + | + | By default, Fortify will throttle logins to five requests per minute for + | every email and IP address combination. However, if you would like to + | specify a custom rate limiter to call then you may specify it here. + | + */ + + 'limiters' => [ + 'login' => null, + ], + + /* + |-------------------------------------------------------------------------- + | Features + |-------------------------------------------------------------------------- + | + | Some of the Fortify features are optional. You may disable the features + | by removing them from this array. You're free to only remove some of + | these features or you can even remove all of these if you need to. + | + */ + + 'features' => [ + Features::registration(), + Features::resetPasswords(), + Features::emailVerification(), + Features::updateProfileInformation(), + Features::updatePasswords(), + Features::twoFactorAuthentication([ + 'confirmPassword' => true, + ]), + ], + + /* + |-------------------------------------------------------------------------- + | Models + |-------------------------------------------------------------------------- + */ + + 'models' => [ + 'user' => User::class, + 'invitation' => Invitation::class, + ], + +]; diff --git a/config/github.php b/config/github.php new file mode 100644 index 0000000..b968e7d --- /dev/null +++ b/config/github.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + /* + |-------------------------------------------------------------------------- + | Default Connection Name + |-------------------------------------------------------------------------- + | + | Here you may specify which of the connections below you wish to use as + | your default connection for all work. Of course, you may use many + | connections at once using the manager class. + | + */ + + 'default' => 'app', + + /* + |-------------------------------------------------------------------------- + | GitHub Connections + |-------------------------------------------------------------------------- + | + | Here are each of the connections setup for your application. Example + | configuration has been included, but you may add as many connections as + | you would like. Note that the 5 supported authentication methods are: + | "application", "jwt", "none", "password", and "token". + | + */ + + 'connections' => [ + 'main' => [ + 'token' => 'your-token', + 'method' => 'token', + // 'backoff' => false, + // 'cache' => false, + // 'version' => 'v3', + // 'enterprise' => false, + ], + + 'jwt' => [ + 'token' => 'your-jwt-token', + 'method' => 'jwt', + // 'backoff' => false, + // 'cache' => false, + // 'version' => 'v3', + // 'enterprise' => false, + ], + + 'other' => [ + 'username' => 'your-username', + 'password' => 'your-password', + 'method' => 'password', + // 'backoff' => false, + // 'cache' => false, + // 'version' => 'v3', + // 'enterprise' => false, + ], + + 'none' => [ + 'method' => 'none', + // 'backoff' => false, + // 'cache' => false, + // 'version' => 'v3', + // 'enterprise' => false, + ], + + 'private' => [ + 'appId' => 'your-github-app-id', + 'keyPath' => 'your-private-key-path', + 'method' => 'private', + // 'backoff' => false, + // 'cache' => false, + // 'version' => 'v3', + // 'enterprise' => false, + ], + ], +]; diff --git a/config/google2fa.php b/config/google2fa.php new file mode 100644 index 0000000..f2ddad2 --- /dev/null +++ b/config/google2fa.php @@ -0,0 +1,81 @@ + true, + + /* + * Lifetime in minutes. + * + * In case you need your users to be asked for a new one time passwords from time to time. + */ + 'lifetime' => 0, // 0 = eternal + + /* + * Renew lifetime at every new request. + */ + 'keep_alive' => true, + + /* + * Auth container binding. + */ + 'auth' => 'auth', + + /* + * 2FA verified session var. + */ + + 'session_var' => 'google2fa', + + /* + * One Time Password request input name. + */ + 'otp_input' => 'one_time_password', + + /* + * One Time Password Window. + */ + 'window' => 1, + + /* + * Forbid user to reuse One Time Passwords. + */ + 'forbid_old_passwords' => false, + + /* + * User's table column for google2fa secret. + */ + 'otp_secret_column' => 'google2fa_secret', + + /* + * One Time Password View. + */ + 'view' => 'google2fa.index', + + /* + * One Time Password error message. + */ + 'error_messages' => [ + 'wrong_otp' => "The 'One Time Password' typed was wrong.", + 'cannot_be_empty' => 'One Time Password cannot be empty.', + 'unknown' => 'An unknown error has occurred. Please try again.', + ], + + /* + * Throw exceptions or just fire events? + */ + 'throw_exceptions' => true, + + /* + * Which image backend to use for generating QR codes? + * + * Supports imagemagick, svg and eps + */ + 'qrcode_image_backend' => \PragmaRX\Google2FALaravel\Support\Constants::QRCODE_IMAGE_BACKEND_SVG, + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..7b49806 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 1024, + 'threads' => 2, + 'time' => 2, + ], +]; diff --git a/config/hermes.php b/config/hermes.php new file mode 100644 index 0000000..8ae7194 --- /dev/null +++ b/config/hermes.php @@ -0,0 +1,15 @@ + [ + + 'notification' => DatabaseNotification::class, + + ], + +]; diff --git a/config/horizon.php b/config/horizon.php new file mode 100644 index 0000000..6f5e46c --- /dev/null +++ b/config/horizon.php @@ -0,0 +1,181 @@ + null, + + /* + |-------------------------------------------------------------------------- + | Horizon Path + |-------------------------------------------------------------------------- + | + | This is the URI path where Horizon will be accessible from. Feel free + | to change this path to anything you like. Note that the URI will not + | affect the paths of its internal API that aren't exposed to users. + | + */ + + 'path' => 'horizon', + + /* + |-------------------------------------------------------------------------- + | Horizon Redis Connection + |-------------------------------------------------------------------------- + | + | This is the name of the Redis connection where Horizon will store the + | meta information required for it to function. It includes the list + | of supervisors, failed jobs, job metrics, and other information. + | + */ + + 'use' => 'default', + + /* + |-------------------------------------------------------------------------- + | Horizon Redis Prefix + |-------------------------------------------------------------------------- + | + | This prefix will be used when storing all Horizon data in Redis. You + | may modify the prefix when you are running multiple installations + | of Horizon on the same server so that they don't have problems. + | + */ + + 'prefix' => env('HORIZON_PREFIX', 'horizon:'), + + /* + |-------------------------------------------------------------------------- + | Horizon Route Middleware + |-------------------------------------------------------------------------- + | + | These middleware will get attached onto each Horizon route, giving you + | the chance to add your own middleware to this list or change any of + | the existing middleware. Or, you can simply stick with this list. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Queue Wait Time Thresholds + |-------------------------------------------------------------------------- + | + | This option allows you to configure when the LongWaitDetected event + | will be fired. Every connection / queue combination may have its + | own, unique threshold (in seconds) before this event is fired. + | + */ + + 'waits' => [ + 'redis:default' => 60, + ], + + /* + |-------------------------------------------------------------------------- + | Job Trimming Times + |-------------------------------------------------------------------------- + | + | Here you can configure for how long (in minutes) you desire Horizon to + | persist the recent and failed jobs. Typically, recent jobs are kept + | for one hour while all failed jobs are stored for an entire week. + | + */ + + 'trim' => [ + 'recent' => 60, + 'recent_failed' => 10080, + 'failed' => 10080, + 'monitored' => 10080, + ], + + /* + |-------------------------------------------------------------------------- + | Fast Termination + |-------------------------------------------------------------------------- + | + | When this option is enabled, Horizon's "terminate" command will not + | wait on all of the workers to terminate unless the --wait option + | is provided. Fast termination can shorten deployment delay by + | allowing a new instance of Horizon to start while the last + | instance will continue to terminate each of its workers. + | + */ + + 'fast_termination' => false, + + /* + |-------------------------------------------------------------------------- + | Memory Limit (MB) + |-------------------------------------------------------------------------- + | + | This value describes the maximum amount of memory the Horizon worker + | may consume before it is terminated and restarted. You should set + | this value according to the resources available to your server. + | + */ + + 'memory_limit' => 64, + + /* + |-------------------------------------------------------------------------- + | Queue Worker Configuration + |-------------------------------------------------------------------------- + | + | Here you may define the queue worker settings used by your application + | in all environments. These supervisors and settings handle all your + | queued jobs and will be provisioned by Horizon during deployment. + | + */ + + 'environments' => [ + 'production' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['default'], + 'balance' => 'simple', + 'processes' => 10, + 'tries' => 5, + ], + 'supervisor-long-running' => [ + 'connection' => 'redis-long-running', + 'queue' => ['long-running-queue'], + 'balance' => 'simple', + 'processes' => 10, + 'tries' => 5, + 'timeout' => 3600, + ], + ], + + 'local' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['default'], + 'balance' => 'simple', + 'processes' => 10, + 'tries' => 5, + ], + 'supervisor-long-running' => [ + 'connection' => 'redis-long-running', + 'queue' => ['long-running-queue'], + 'balance' => 'simple', + 'processes' => 10, + 'tries' => 5, + 'timeout' => 3600, + ], + ], + ], +]; diff --git a/config/livewire.php b/config/livewire.php new file mode 100644 index 0000000..e87e17a --- /dev/null +++ b/config/livewire.php @@ -0,0 +1,160 @@ + 'App\\Http\\Livewire', + + /* + |-------------------------------------------------------------------------- + | View Path + |-------------------------------------------------------------------------- + | + | This value sets the path for Livewire component views. This affects + | file manipulation helper commands like `artisan make:livewire`. + | + */ + + 'view_path' => resource_path('views/livewire'), + + /* + |-------------------------------------------------------------------------- + | Layout + |-------------------------------------------------------------------------- + | The default layout view that will be used when rendering a component via + | Route::get('/some-endpoint', SomeComponent::class);. In this case the + | the view returned by SomeComponent will be wrapped in "layouts.app" + | + */ + + 'layout' => 'layouts.app', + + /* + |-------------------------------------------------------------------------- + | Livewire Assets URL + |-------------------------------------------------------------------------- + | + | This value sets the path to Livewire JavaScript assets, for cases where + | your app's domain root is not the correct path. By default, Livewire + | will load its JavaScript assets from the app's "relative root". + | + | Examples: "/assets", "myurl.com/app". + | + */ + + 'asset_url' => null, + + /* + |-------------------------------------------------------------------------- + | Livewire App URL + |-------------------------------------------------------------------------- + | + | This value should be used if livewire assets are served from CDN. + | Livewire will communicate with an app through this url. + | + | Examples: "https://my-app.com", "myurl.com/app". + | + */ + + 'app_url' => null, + + /* + |-------------------------------------------------------------------------- + | Livewire Endpoint Middleware Group + |-------------------------------------------------------------------------- + | + | This value sets the middleware group that will be applied to the main + | Livewire "message" endpoint (the endpoint that gets hit everytime + | a Livewire component updates). It is set to "web" by default. + | + */ + + 'middleware_group' => 'web', + + /* + |-------------------------------------------------------------------------- + | Livewire Temporary File Uploads Endpoint Configuration + |-------------------------------------------------------------------------- + | + | Livewire handles file uploads by storing uploads in a temporary directory + | before the file is validated and stored permanently. All file uploads + | are directed to a global endpoint for temporary storage. The config + | items below are used for customizing the way the endpoint works. + | + */ + + 'temporary_file_upload' => [ + 'disk' => null, // Example: 'local', 's3' Default: 'default' + 'rules' => null, // Example: ['file', 'mimes:png,jpg'] Default: ['required', 'file', 'max:12288'] (12MB) + 'directory' => null, // Example: 'tmp' Default 'livewire-tmp' + 'middleware' => null, // Example: 'throttle:5,1' Default: 'throttle:60,1' + 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs. + 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4', + 'mov', 'avi', 'wmv', 'mp3', 'm4a', + 'jpg', 'jpeg', 'mpga', 'webp', 'wma', + ], + 'max_upload_time' => 5, // Max duration (in minutes) before an upload gets invalidated. + ], + + /* + |-------------------------------------------------------------------------- + | Manifest File Path + |-------------------------------------------------------------------------- + | + | This value sets the path to the Livewire manifest file. + | The default should work for most cases (which is + | "/bootstrap/cache/livewire-components.php"), but for specific + | cases like when hosting on Laravel Vapor, it could be set to a different value. + | + | Example: for Laravel Vapor, it would be "/tmp/storage/bootstrap/cache/livewire-components.php". + | + */ + + 'manifest_path' => null, + + /* + |-------------------------------------------------------------------------- + | Back Button Cache + |-------------------------------------------------------------------------- + | + | This value determines whether the back button cache will be used on pages + | that contain Livewire. By disabling back button cache, it ensures that + | the back button shows the correct state of components, instead of + | potentially stale, cached data. + | + | Setting it to "false" (default) will disable back button cache. + | + */ + + 'back_button_cache' => false, + + /* + |-------------------------------------------------------------------------- + | Render On Redirect + |-------------------------------------------------------------------------- + | + | This value determines whether Livewire will render before it's redirected + | or not. Setting it to "false" (default) will mean the render method is + | skipped when redirecting. And "true" will mean the render method is + | run before redirecting. Browsers bfcache can store a potentially + | stale view if render is skipped on redirect. + | + */ + + 'render_on_redirect' => true, + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..ee24948 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,94 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['daily'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + 'days' => 14, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => 'critical', + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => 'debug', + 'handler' => SyslogUdpHandler::class, + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => 'debug', + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => 'debug', + ], + ], +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..ac9f822 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,113 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => '/usr/sbin/sendmail -bs', + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Stub Address that acts as catch-all + |-------------------------------------------------------------------------- + */ + + 'stub' => [ + 'address' => env('MAIL_TO_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_TO_NAME', 'Example'), + ], + +]; diff --git a/config/model-status.php b/config/model-status.php new file mode 100644 index 0000000..fd4f56a --- /dev/null +++ b/config/model-status.php @@ -0,0 +1,20 @@ + Domain\Status\Models\Status::class, + + /* + * The name of the column which holds the ID of the model related to the statuses. + * + * You can change this value if you have set a different name in the migration for the statuses table. + */ + 'model_primary_key_attribute' => 'model_id', +]; diff --git a/config/personal-data-export.php b/config/personal-data-export.php new file mode 100644 index 0000000..47b525e --- /dev/null +++ b/config/personal-data-export.php @@ -0,0 +1,36 @@ + 'personal-data-exports', + + /* + * The amount of days the exports will be available. + */ + 'delete_after_days' => 5, + + /* + * Determines whether the user should be logged in to be able + * to access the export. + */ + 'authentication_required' => true, + + /* + * The notification which will be sent to the user when the export + * has been created. + */ + 'notification' => \App\User\Mail\PersonalDataExport::class, + + /* + * Configure the queue and connection used by `CreatePersonalDataExportJob` + * which will create the export. + */ + 'job' => [ + 'queue' => null, + 'connection' => null, + ], +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..e9bda44 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,99 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'your-queue-name'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + ], + + 'redis-long-running' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 3600, + 'block_for' => null, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/responsecache.php b/config/responsecache.php new file mode 100644 index 0000000..ead809c --- /dev/null +++ b/config/responsecache.php @@ -0,0 +1,73 @@ + env('RESPONSE_CACHE_ENABLED', false), + + /* + * The given class will determinate if a request should be cached. The + * default class will cache all successful GET-requests. + * + * You can provide your own class given that it implements the + * CacheProfile interface. + */ + 'cache_profile' => Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests::class, + + /* + * When using the default CacheRequestFilter this setting controls the + * default number of seconds responses must be cached. + */ + 'cache_lifetime_in_seconds' => env('RESPONSE_CACHE_LIFETIME', 60 * 60 * 24 * 7), + + /* + * This setting determines if a http header named with the cache time + * should be added to a cached response. This can be handy when + * debugging. + */ + 'add_cache_time_header' => env('APP_DEBUG', true), + + /* + * This setting determines the name of the http header that contains + * the time at which the response was cached + */ + 'cache_time_header_name' => env('RESPONSE_CACHE_HEADER_NAME', 'oc-responsecache'), + + /* + * Here you may define the cache store that should be used to store + * requests. This can be the name of any store that is + * configured in app/config/cache.php + */ + 'cache_store' => env('RESPONSE_CACHE_DRIVER', 'file'), + + /* + * Here you may define replacers that dynamically replace content from the response. + * Each replacer must implement the Replacer interface. + */ + 'replacers' => [ + \Spatie\ResponseCache\Replacers\CsrfTokenReplacer::class, + ], + + /* + * If the cache driver you configured supports tags, you may specify a tag name + * here. All responses will be tagged. When clearing the responsecache only + * items with that tag will be flushed. + * + * You may use a string or an array here. + */ + 'cache_tag' => '', + + /* + * This class is responsible for generating a hash for a request. This hash + * is used to look up an cached response. + */ + 'hasher' => \Spatie\ResponseCache\Hasher\DefaultHasher::class, + + /* + * This class is responsible for serializing responses. + */ + 'serializer' => \Spatie\ResponseCache\Serializers\DefaultSerializer::class, +]; diff --git a/config/sentry.php b/config/sentry.php new file mode 100644 index 0000000..5b22f29 --- /dev/null +++ b/config/sentry.php @@ -0,0 +1,15 @@ + env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')), + + // capture release as git sha + // 'release' => trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')), + + 'breadcrumbs' => [ + // Capture bindings on SQL queries logged in breadcrumbs + 'sql_bindings' => true, + ], +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..6046e9f --- /dev/null +++ b/config/services.php @@ -0,0 +1,39 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'recaptcha' => [ + 'site' => env('RECAPTCHA_SITE'), + 'secret' => env('RECAPTCHA_SECRET'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..715dd82 --- /dev/null +++ b/config/session.php @@ -0,0 +1,199 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION', null), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using the "apc", "memcached", or "dynamodb" session drivers you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + */ + + 'store' => env('SESSION_STORE', null), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN', null), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you if it can not be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE', null), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | do not enable this as other CSRF protection services are in place. + | + | Supported: "lax", "strict" + | + */ + + 'same_site' => 'lax', +]; diff --git a/config/social.php b/config/social.php new file mode 100644 index 0000000..ede3c53 --- /dev/null +++ b/config/social.php @@ -0,0 +1,17 @@ + [ + 'twitter' => [ + 'icon' => 'brands.solid.twitter', + 'url' => 'https://twitter.com/Ardent_HQ', + ], + + 'github' => [ + 'icon' => 'brands.solid.github', + 'url' => 'https://github.com/ArdentHQ', + ], + ], +]; diff --git a/config/telescope.php b/config/telescope.php new file mode 100644 index 0000000..3c00d2a --- /dev/null +++ b/config/telescope.php @@ -0,0 +1,154 @@ + null, + + /* + |-------------------------------------------------------------------------- + | Telescope Path + |-------------------------------------------------------------------------- + | + | This is the URI path where Telescope will be accessible from. Feel free + | to change this path to anything you like. Note that the URI will not + | affect the paths of its internal API that aren't exposed to users. + | + */ + + 'path' => 'telescope', + + /* + |-------------------------------------------------------------------------- + | Telescope Storage Driver + |-------------------------------------------------------------------------- + | + | This configuration options determines the storage driver that will + | be used to store Telescope's data. In addition, you may set any + | custom options as needed by the particular driver you choose. + | + */ + + 'driver' => env('TELESCOPE_DRIVER', 'database'), + + 'storage' => [ + 'database' => [ + 'connection' => env('DB_CONNECTION', 'mysql'), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Telescope Master Switch + |-------------------------------------------------------------------------- + | + | This option may be used to disable all Telescope watchers regardless + | of their individual configuration, which simply provides a single + | and convenient way to enable or disable Telescope data storage. + | + */ + + 'enabled' => env('TELESCOPE_ENABLED', true), + + /* + |-------------------------------------------------------------------------- + | Telescope Route Middleware + |-------------------------------------------------------------------------- + | + | These middleware will be assigned to every Telescope route, giving you + | the chance to add your own middleware to this list or change any of + | the existing middleware. Or, you can simply stick with this list. + | + */ + + 'middleware' => [ + 'web', + Authorize::class, + ], + + /* + |-------------------------------------------------------------------------- + | Ignored Paths & Commands + |-------------------------------------------------------------------------- + | + | The following array lists the URI paths and Artisan commands that will + | not be watched by Telescope. In addition to this list, some Laravel + | commands, like migrations and queue commands, are always ignored. + | + */ + + 'ignore_paths' => [ + ], + + 'ignore_commands' => [ + ], + + /* + |-------------------------------------------------------------------------- + | Telescope Watchers + |-------------------------------------------------------------------------- + | + | The following array lists the "watchers" that will be registered with + | Telescope. The watchers gather the application's profile data when + | a request or task is executed. Feel free to customize this list. + | + */ + + 'watchers' => [ + Watchers\CacheWatcher::class => env('TELESCOPE_CACHE_WATCHER', true), + + Watchers\CommandWatcher::class => [ + 'enabled' => env('TELESCOPE_COMMAND_WATCHER', true), + 'ignore' => [], + ], + + Watchers\DumpWatcher::class => env('TELESCOPE_DUMP_WATCHER', true), + Watchers\EventWatcher::class => env('TELESCOPE_EVENT_WATCHER', true), + Watchers\ExceptionWatcher::class => env('TELESCOPE_EXCEPTION_WATCHER', true), + Watchers\JobWatcher::class => env('TELESCOPE_JOB_WATCHER', true), + Watchers\LogWatcher::class => env('TELESCOPE_LOG_WATCHER', true), + Watchers\MailWatcher::class => env('TELESCOPE_MAIL_WATCHER', true), + + Watchers\ModelWatcher::class => [ + 'enabled' => env('TELESCOPE_MODEL_WATCHER', true), + 'events' => ['eloquent.*'], + ], + + Watchers\NotificationWatcher::class => env('TELESCOPE_NOTIFICATION_WATCHER', true), + + Watchers\QueryWatcher::class => [ + 'enabled' => env('TELESCOPE_QUERY_WATCHER', true), + 'ignore_packages' => true, + 'slow' => 100, + ], + + Watchers\RedisWatcher::class => env('TELESCOPE_REDIS_WATCHER', true), + + Watchers\RequestWatcher::class => [ + 'enabled' => env('TELESCOPE_REQUEST_WATCHER', true), + 'size_limit' => env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64), + ], + + Watchers\GateWatcher::class => [ + 'enabled' => env('TELESCOPE_GATE_WATCHER', true), + 'ignore_abilities' => [], + 'ignore_packages' => true, + ], + + Watchers\ScheduleWatcher::class => env('TELESCOPE_SCHEDULE_WATCHER', true), + ], +]; diff --git a/config/tracking.php b/config/tracking.php new file mode 100644 index 0000000..b796a64 --- /dev/null +++ b/config/tracking.php @@ -0,0 +1,10 @@ + [ + 'key' => env('GOOGLE_ANALYTICS_TRACKING_KEY'), + 'domain' => env('GOOGLE_ANALYTICS_COOKIE_DOMAIN'), + ], +]; diff --git a/config/trustedproxy.php b/config/trustedproxy.php new file mode 100644 index 0000000..6772ca1 --- /dev/null +++ b/config/trustedproxy.php @@ -0,0 +1,8 @@ + env('APP_ENV', 'production') === 'local' ? '*' : [], +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..548125a --- /dev/null +++ b/config/view.php @@ -0,0 +1,51 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + + /* + |-------------------------------------------------------------------------- + | Blade View Modification Checking + |-------------------------------------------------------------------------- + | + | On every request the framework will check to see if a view has expired + | to determine if it needs to be recompiled. If you are in production + | and precompiling views this feature may be disabled to save time. + | + */ + + 'expires' => env('VIEW_CHECK_EXPIRATION', true), + +]; diff --git a/config/web.php b/config/web.php new file mode 100644 index 0000000..ce1e514 --- /dev/null +++ b/config/web.php @@ -0,0 +1,23 @@ + [ + 'source' => 'ARKLauncher', + 'subjects' => [ + [ + 'label' => 'General', + 'value' => 'general', + ], + [ + 'label' => 'Bug Report', + 'value' => 'bug_report', + ], + [ + 'label' => 'Other', + 'value' => 'other', + ], + ], + ], +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..97fc976 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1,2 @@ +*.sqlite +*.sqlite-journal diff --git a/database/factories/CoinFactory.php b/database/factories/CoinFactory.php new file mode 100644 index 0000000..f5d5d46 --- /dev/null +++ b/database/factories/CoinFactory.php @@ -0,0 +1,32 @@ + 'ARK', + 'slug' => 'ark', + 'symbol' => 'ARK', + ]; + } +} diff --git a/database/factories/DatabaseNotificationFactory.php b/database/factories/DatabaseNotificationFactory.php new file mode 100644 index 0000000..3bc523d --- /dev/null +++ b/database/factories/DatabaseNotificationFactory.php @@ -0,0 +1,47 @@ + $this->faker->uuid(), + 'type' => "App\TestNotification", + 'notifiable_type' => User::class, + 'notifiable_id' => $this->token ? $this->token->user->id : 1, + 'data' => [ + 'relatable_type' => $this->token ? $this->token->getMorphClass() : null, + 'relatable_id' => $this->token ? $this->token->getKey() : null, + 'token' => $this->token ? $this->token->id : 1, + 'content' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + 'type' => 'success', + 'action' => [ + 'title' => 'View', + 'url' => route('home'), + ], + ], + ]; + } + + public function ownedBy(Token $token) + { + $this->token = $token; + + return $this; + } +} diff --git a/database/factories/InvitationFactory.php b/database/factories/InvitationFactory.php new file mode 100644 index 0000000..55a7216 --- /dev/null +++ b/database/factories/InvitationFactory.php @@ -0,0 +1,43 @@ + $this->faker->uuid(), + 'token_id' => Token::factory(), + 'user_id' => User::factory(), + 'email' => $this->faker->email(), + 'role' => 'collaborator', + 'permissions' => $this->faker->randomElements( + $permissions, + $this->faker->numberBetween(1, count($permissions)) + ), + ]; + } +} diff --git a/database/factories/NetworkFactory.php b/database/factories/NetworkFactory.php new file mode 100644 index 0000000..7f7d622 --- /dev/null +++ b/database/factories/NetworkFactory.php @@ -0,0 +1,50 @@ + $this->token ?? Token::factory(), + 'name' => 'mainnet', + ]; + } + + public function ownedBy(Token $token) + { + $this->token = $token; + + return $this; + } + + public function createForTest() + { + $network = $this->create(['token_id' => $this->token ?? Token::factory()]); + + return Network::findOrFail($network->id); + } +} diff --git a/database/factories/SecureShellKeyFactory.php b/database/factories/SecureShellKeyFactory.php new file mode 100644 index 0000000..c36d0d8 --- /dev/null +++ b/database/factories/SecureShellKeyFactory.php @@ -0,0 +1,52 @@ + $this->faker->firstName(), + 'user_id' => $this->user ?? User::factory(), + 'public_key' => 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCYAi5XvpgT1tBUFVwD4fc+XigWVKUkBx0OhbGbxfm918TmarQy4LDKtX3Xqjm6ownmVE97E1Gvc5sIln6hwk+mtkXqQMrdD8tNqtYIr2mwW5yJDON0ml8mhn1Kb5myRkdFX+B411c3OJrsIv7t1OUAsAx+mrX4wanHENOnhHRhuiXP08OkXXpwQYPItmNWwyokcZ9etI6eP9SMlyrdneZTCZWsf++Gv4zh+XTdchiaYfiquAmtFwYnC3VinUwMuZPWhvYHL7Loo9sYTPpoW1YR/wyIhM33nd3yOnIPVODp8mn/VjjYRLPjYkhzOejOlP2W3MVkSY2SX156X5Rm7XDsggq0gWEHZ01lYhvWzO3gfUNjUH+3PDKNJcl+pOEjSHCsIKSFfTxV6cMkUhKFx2b0Gw8Q2msToZSFnzczyLXPA6r+9DMS0X78buBh+JXOevXaV2nWGrOvEmSyQBMLVb9EeRrmFnOwoxubIc7BDQpKJT3Pd62s+pWkSJrc/gegHCQzxZ8ZZZfwACTezm7u333MiuAf/VEUMMTUCyGjNmbPGtqIhDbQvRokxsEz0jNYuCy8OpsOZDLHn20lEw7nIXVe17YAV4ByvDXKqKNnX9fd6AsgSQlyF7VpGWN2dGZ9CpNVkHpy29skTWzKwLGGD+SmIspBec5lxZz+HaFWZDra1Q== robot@ark.io', + // 'public_key' => ShellSecureShellKey::make()['publicKey'], + ]; + } + + public function ownedBy(User $user) + { + $this->user = $user; + + return $this; + } + + public function createForTest($overrides = []) + { + $secureShellKey = $this->create( + array_merge($overrides, ['user_id' => $this->user ?? User::factory()]) + ); + + return SecureShellKey::findOrFail($secureShellKey->id); + } +} diff --git a/database/factories/ServerFactory.php b/database/factories/ServerFactory.php new file mode 100644 index 0000000..967bb45 --- /dev/null +++ b/database/factories/ServerFactory.php @@ -0,0 +1,133 @@ + Network::factory(), + 'server_provider_id' => ServerProvider::factory(), + 'name' => Str::slug($this->faker->name()), + 'provider_server_id' => mt_rand(1000000, 9999999), + 'server_provider_plan_id' => ServerProviderPlan::factory(), + 'server_provider_region_id' => ServerProviderRegion::factory(), + 'server_provider_image_id' => ServerProviderImage::factory(), + 'ip_address' => $this->faker->ipv4(), + 'user_password' => $this->faker->password(), + 'sudo_password' => $this->faker->password(), + 'delegate_passphrase' => $this->faker->password(), + 'delegate_password' => $this->faker->password(), + 'preset' => 'relay', + ]; + } + + public function hetzner() + { + return $this->state([ + 'server_provider_id' => ServerProvider::factory()->hetzner(), + ]); + } + + public function digitalocean() + { + return $this->state([ + 'server_provider_id' => ServerProvider::factory()->digitalocean(), + ]); + } + + public function vultr() + { + return $this->state([ + 'server_provider_id' => ServerProvider::factory()->vultr(), + ]); + } + + public function linode() + { + return $this->state([ + 'server_provider_id' => ServerProvider::factory()->linode(), + ]); + } + + public function aws() + { + return $this->state([ + 'server_provider_id' => ServerProvider::factory()->aws(), + ]); + } + + public function genesis() + { + return $this->state(['preset' => 'genesis']); + } + + public function seed() + { + return $this->state(['preset' => 'seed']); + } + + public function relay() + { + return $this->state(['preset' => 'relay']); + } + + public function forger() + { + return $this->state(['preset' => 'forger']); + } + + public function explorer() + { + return $this->state(['preset' => 'explorer']); + } + + public function ownedBy(Network $network) + { + $this->network = $network; + + return $this; + } + + public function createForTest(?array $attributes = []) + { + $server = $this->create([ + 'network_id' => $this->network ?? Network::factory(), + ] + $attributes); + + $server->setMetaAttribute(ServerAttributeEnum::CREATOR, $server->token->user->id); + + $server->token->shareWith($server->token->user, 'owner'); + + return Server::findOrFail($server->id); + } +} diff --git a/database/factories/ServerProviderFactory.php b/database/factories/ServerProviderFactory.php new file mode 100644 index 0000000..d544c9b --- /dev/null +++ b/database/factories/ServerProviderFactory.php @@ -0,0 +1,142 @@ + $this->token ?? Token::factory(), + 'type' => ServerProviderTypeEnum::DIGITALOCEAN, + 'name' => $this->faker->unique()->domainName(), + 'extra_attributes' => ['accessToken' => encrypt(Str::random(42))], + 'provider_key_id' => 512190, + ]; + } + + public function digitalocean() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::DIGITALOCEAN, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 512190, + ]); + } + + public function hetzner() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::HETZNER, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 2323, + ]); + } + + public function vultr() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::VULTR, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => '541b4960f23bd', + ]); + } + + public function linode() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::LINODE, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 1234, + ]); + } + + public function aws() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::AWS, + 'name' => $this->faker->unique()->domainName(), + 'extra_attributes' => [ + 'accessToken' => encrypt(Str::random(42)), + 'accessKey' => encrypt(Str::random(42)), + ], + ]); + } + + public function withRegions() + { + return $this->afterCreating(function (ServerProvider $serverProvider) { + $serverProvider->regions() + ->syncWithoutDetaching(ServerProviderRegion::factory()->count(3)->create()); + }); + } + + public function withImages() + { + return $this->afterCreating(function (ServerProvider $serverProvider) { + $serverProvider->images() + ->syncWithoutDetaching(ServerProviderImage::factory()->count(3)->create()); + }); + } + + public function withPlans() + { + return $this->afterCreating(function (ServerProvider $serverProvider) { + $override = [ + 'memory' => config('deployer.deployment.minimumServerRam') + 1, + ]; + if ($serverProvider->regions()->exists()) { + $override['regions'] = $serverProvider->regions()->pluck('uuid'); + } + $serverProvider->plans() + ->syncWithoutDetaching( + ServerProviderPlan::factory()->count(3)->create($override) + ); + }); + } + + public function ownedBy(Token $token) + { + $this->token = $token; + + return $this; + } + + public function createForTest(?array $attributes = []) + { + $serverProvider = $this->create([ + 'token_id' => $this->token ?? Token::factory(), + ] + $attributes); + + $serverProvider->token->shareWith($serverProvider->token->user, 'owner'); + + return ServerProvider::findOrFail($serverProvider->id); + } +} diff --git a/database/factories/ServerProviderImageFactory.php b/database/factories/ServerProviderImageFactory.php new file mode 100644 index 0000000..39e0b09 --- /dev/null +++ b/database/factories/ServerProviderImageFactory.php @@ -0,0 +1,83 @@ + $this->faker->uuid(), + 'name' => $this->faker->name(), + ]; + } + + public function digitalocean() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::DIGITALOCEAN, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 512190, + ]); + } + + public function hetzner() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::HETZNER, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 2323, + ]); + } + + public function vultr() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::VULTR, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => '541b4960f23bd', + ]); + } + + public function linode() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::LINODE, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 1234, + ]); + } + + public function aws() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::AWS, + 'name' => $this->faker->unique()->domainName(), + 'extra_attributes' => [ + 'accessToken' => encrypt(Str::random(42)), + 'accessKey' => encrypt(Str::random(42)), + ], + ]); + } +} diff --git a/database/factories/ServerProviderPlanFactory.php b/database/factories/ServerProviderPlanFactory.php new file mode 100644 index 0000000..767f28f --- /dev/null +++ b/database/factories/ServerProviderPlanFactory.php @@ -0,0 +1,91 @@ +faker->numberBetween(1, 8); + $memory = $this->faker->randomElement([2, 4, 8, 16, 32]); + + $uuid = (string) Str::uuid(); + + return [ + 'uuid' => "{$uuid}-{$cores}vpcu-{$memory}gb{$this->faker->randomElement(['-intel', '-amd', ''])}", + 'disk' => $this->faker->numberBetween(1, 1024), + 'memory' => $memory * 1024, + 'cores' => $cores, + 'regions' => $this->faker->words(), + ]; + } + + public function digitalocean() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::DIGITALOCEAN, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 512190, + ]); + } + + public function hetzner() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::HETZNER, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 2323, + ]); + } + + public function vultr() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::VULTR, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => '541b4960f23bd', + ]); + } + + public function linode() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::LINODE, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 1234, + ]); + } + + public function aws() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::AWS, + 'name' => $this->faker->unique()->domainName(), + 'extra_attributes' => [ + 'accessToken' => encrypt(Str::random(42)), + 'accessKey' => encrypt(Str::random(42)), + ], + ]); + } +} diff --git a/database/factories/ServerProviderRegionFactory.php b/database/factories/ServerProviderRegionFactory.php new file mode 100644 index 0000000..96977c6 --- /dev/null +++ b/database/factories/ServerProviderRegionFactory.php @@ -0,0 +1,83 @@ + $this->faker->uuid(), + 'name' => $this->faker->unique()->city(), + ]; + } + + public function digitalocean() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::DIGITALOCEAN, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 512190, + ]); + } + + public function hetzner() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::HETZNER, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 2323, + ]); + } + + public function vultr() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::VULTR, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => '541b4960f23bd', + ]); + } + + public function linode() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::LINODE, + 'name' => $this->faker->unique()->domainName(), + 'provider_key_id' => 1234, + ]); + } + + public function aws() + { + return $this->state([ + 'type' => ServerProviderTypeEnum::AWS, + 'name' => $this->faker->unique()->domainName(), + 'extra_attributes' => [ + 'accessToken' => encrypt(Str::random(42)), + 'accessKey' => encrypt(Str::random(42)), + ], + ]); + } +} diff --git a/database/factories/ServerTaskFactory.php b/database/factories/ServerTaskFactory.php new file mode 100644 index 0000000..309d7c8 --- /dev/null +++ b/database/factories/ServerTaskFactory.php @@ -0,0 +1,41 @@ + Server::factory(), + 'type' => ProvisionUser::class, + 'name' => $this->faker->firstName(), + 'user' => $this->faker->username(), + 'exit_code' => 0, + 'script' => $this->faker->word(), + 'output' => $this->faker->paragraph(), + 'options' => [], + ]; + } +} diff --git a/database/factories/TokenFactory.php b/database/factories/TokenFactory.php new file mode 100644 index 0000000..22ba139 --- /dev/null +++ b/database/factories/TokenFactory.php @@ -0,0 +1,297 @@ + [ + 'static' => [ + 'vote' => 100000000, + 'transfer' => 10000000, + 'multiSignature' => 500000000, + 'secondSignature' => 500000000, + 'delegateRegistration' => 2500000000, + 'ipfs' => 0, + 'multiPayment' => 0, + 'delegateResignation' => 2500000000, + ], + 'dynamic' => [ + 'enabled' => false, + 'addonBytes' => [ + 'ipfs' => 250, + 'vote' => 100, + 'transfer' => 100, + 'multiPayment' => 500, + 'multiSignature' => 500, + 'secondSignature' => 250, + 'delegateResignation' => 400000, + 'delegateRegistration' => 400000, + ], + 'minFeePool' => 3000, + 'minFeeBroadcast' => 3000, + ], + ], + 'token' => 'TST', + 'coreIp' => '127.0.0.1', + 'symbol' => 'TST', + 'apiPort' => 4003, + 'forgers' => 51, + 'p2pPort' => 4000, + 'blocktime' => 8, + 'chainName' => 'testing', + 'explorerIp' => '0.0.0.0', + 'devnetPeers' => [ + 0 => '0.0.0.0', + ], + 'webhookPort' => 4004, + 'monitorPort' => 4005, + 'databaseHost' => '1.1.1.1', + 'databaseName' => 'core_token', + 'databasePort' => '5432', + 'devnetPrefix' => 'D', + 'explorerPort' => 4200, + 'licenseEmail' => null, + 'mainnetPeers' => [ + 0 => '0.0.0.0', + ], + 'totalPremine' => 2100000000000000, + 'mainnetPrefix' => 'M', + 'testnetPrefix' => 'T', + 'rewardPerBlock' => 200000000, + 'rewardHeightStart' => 1, + 'vendorFieldLength' => 255, + 'transactionsPerBlock' => 150, + 'maxBlockPayload' => 2097152, + 'wif' => 1, + ]; + + protected $user; + + protected $status; + + private int $networkCount = 0; + + private int $serverCount = 1; + + private int $invitationsCount = 1; + + private int $serverProviderCount = 0; + + private bool $defaultNetworks = false; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => User::factory(), + 'coin_id' => Coin::factory(), + 'name' => $this->faker->firstName(), + 'slug' => $this->faker->firstName(), + 'config' => $this->config, + 'keypair' => [ + 'privateKey' => encrypt($this->faker->word()), + 'publicKey' => 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example', + ], + 'extra_attributes' => ['repoName' => $this->faker->firstName()], + ]; + } + + /** + * New token ready to be configured. + */ + public function newly(): Factory + { + $name = $this->faker->slug(3); + + return $this->state(fn () => [ + 'name' => $name, + 'slug' => $name, + 'config' => null, + 'keypair' => null, + 'onboarded_at' => null, + ])->afterCreating(function (Token $token) { + TokenCreated::dispatch($token); + }); + } + + /** + * Onboarding configuration completed. + */ + public function withOnboardingConfigurationCompleted(): Factory + { + $name = $this->faker->slug(3); + + return $this->state(fn () => [ + 'name' => $name, + 'slug' => $name, + ])->afterCreating(function (Token $token) { + TokenCreated::dispatch($token); + + $token->setMetaAttribute('onboarding.configuration_completed_at', Carbon::now()); + }); + } + + /** + * With Onboarding server provider select. + */ + public function withOnboardingServerProvider(): Factory + { + return $this->withOnboardingConfigurationCompleted()->afterCreating(function (Token $token) { + $token->setMetaAttribute('onboarding.server_providers_status', 'completed'); + + ServerProvider::factory() + ->withRegions() + ->withImages() + ->withPlans() + ->create(['token_id' => $token->id]); + }); + } + + /** + * Onboarding server configuration completed. + */ + public function withOnboardingServerConfiguration(): Factory + { + return $this->withOnboardingServerProvider()->afterCreating(function (Token $token) { + $token->setMetaAttribute(TokenAttributeEnum::SERVER_CONFIG, [ + 'server_provider_id' => 1, + ]); + }); + } + + /** + * Onboarding secure shell key completed. + */ + public function withOnboardingSecureShellKey(): Factory + { + return $this->withOnboardingServerConfiguration()->afterCreating(function (Token $token) { + $token->secureShellKeys()->sync(SecureShellKey::factory()->create()->id); + }); + } + + public function ownedBy(User $user) + { + $this->user = $user; + + return $this; + } + + public function withNetwork(int $count): self + { + $this->networkCount = $count; + + return $this; + } + + public function withDefaultNetworks(): self + { + $this->defaultNetworks = true; + + return $this; + } + + public function withServerProviders(int $count): self + { + $this->serverProviderCount = $count; + + return $this; + } + + public function withServers(int $count): self + { + $this->serverCount = $count; + + return $this; + } + + public function withInvitations(int $count): self + { + $this->invitationsCount = $count; + + return $this; + } + + public function withStatus(string $status): self + { + $this->status = $status; + + return $this; + } + + public function createForTest(?array $attributes = []) + { + $user = $this->user ?? User::withoutEvents(function () { + return User::factory()->create(); + }); + + $coin = Coin::withoutEvents(function () { + return Coin::factory()->create(); + }); + + $token = $this->create([ + 'user_id' => $user->id, + 'coin_id' => $coin->id, + ] + $attributes); + + // Share the token with the owner + $token->shareWith($user, 'owner'); + + if ($this->status) { + $token->setStatus($this->status); + } + + if ($this->serverProviderCount > 0) { + for ($i = 0; $i < $this->serverProviderCount; $i++) { + ServerProvider::factory()->ownedBy($token)->createForTest(); + } + } + + // Create default servers + Network::factory($this->networkCount) + ->ownedBy($token) + ->create() + ->each(fn ($network) => Server::factory($this->serverCount)->create(['network_id' => $network->id])); + + // Default Networks + if ($this->defaultNetworks) { + $token->networks()->create(['name' => 'devnet']); + $token->networks()->create(['name' => 'testnet']); + } + + // Invitations + if ($this->invitationsCount > 0) { + Invitation::factory($this->invitationsCount)->create(['token_id' => $token->id]); + } + + return Token::findOrFail($token->id); + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..f933344 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,47 @@ + $this->faker->firstName(), + 'email' => $this->faker->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'timezone' => 'UTC', + 'remember_token' => Str::random(10), + ]; + } +} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 0000000..5968d53 --- /dev/null +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,38 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->string('timezone')->default('UTC')->nullable(); + $table->rememberToken(); + $table->schemalessAttributes('extra_attributes'); + $table->timestamp('seen_welcome_screens_at')->nullable(); + $table->timestamp('seen_notifications_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::dropIfExists('users'); + } +} diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php new file mode 100644 index 0000000..a983a76 --- /dev/null +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -0,0 +1,30 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +} diff --git a/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php new file mode 100644 index 0000000..918bc7c --- /dev/null +++ b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php @@ -0,0 +1,30 @@ +text('two_factor_secret') + ->after('password') + ->nullable(); + + $table->text('two_factor_recovery_codes') + ->after('two_factor_secret') + ->nullable(); + }); + } + + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('two_factor_secret', 'two_factor_recovery_codes'); + }); + } +} diff --git a/database/migrations/2020_01_14_000000_create_failed_jobs_table.php b/database/migrations/2020_01_14_000000_create_failed_jobs_table.php new file mode 100644 index 0000000..949b19d --- /dev/null +++ b/database/migrations/2020_01_14_000000_create_failed_jobs_table.php @@ -0,0 +1,37 @@ +bigIncrements('id'); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +} diff --git a/database/migrations/2020_01_15_000000_create_activity_log_table.php b/database/migrations/2020_01_15_000000_create_activity_log_table.php new file mode 100644 index 0000000..5a19e66 --- /dev/null +++ b/database/migrations/2020_01_15_000000_create_activity_log_table.php @@ -0,0 +1,40 @@ +create(config('activitylog.table_name'), function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('log_name')->nullable(); + $table->text('description'); + $table->unsignedBigInteger('subject_id')->nullable(); + $table->string('subject_type')->nullable(); + $table->unsignedBigInteger('causer_id')->nullable(); + $table->string('causer_type')->nullable(); + $table->json('properties')->nullable(); + $table->timestamps(); + + $table->index('log_name'); + $table->index(['subject_id', 'subject_type'], 'subject'); + $table->index(['causer_id', 'causer_type'], 'causer'); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::connection(config('activitylog.database_connection'))->dropIfExists(config('activitylog.table_name')); + } +} diff --git a/database/migrations/2020_01_15_100000_create_statuses_table.php b/database/migrations/2020_01_15_100000_create_statuses_table.php new file mode 100644 index 0000000..26798bd --- /dev/null +++ b/database/migrations/2020_01_15_100000_create_statuses_table.php @@ -0,0 +1,26 @@ +increments('id'); + $table->string('name'); + $table->text('reason')->nullable(); + $table->morphs('model'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('statuses'); + } +} diff --git a/database/migrations/2020_01_15_101832_create_coin_table.php b/database/migrations/2020_01_15_101832_create_coin_table.php new file mode 100644 index 0000000..304c966 --- /dev/null +++ b/database/migrations/2020_01_15_101832_create_coin_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->string('name', 100)->index(); + $table->string('symbol', 10); + $table->string('slug', 100); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('coins'); + } +} diff --git a/database/migrations/2020_01_16_000000_create_tokens_table.php b/database/migrations/2020_01_16_000000_create_tokens_table.php new file mode 100644 index 0000000..54fb6d9 --- /dev/null +++ b/database/migrations/2020_01_16_000000_create_tokens_table.php @@ -0,0 +1,49 @@ +bigIncrements('id'); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->foreignId('coin_id')->constrained()->cascadeOnDelete(); + $table->string('name')->index(); + $table->string('slug')->nullable(); + $table->json('config')->nullable(); + $table->schemalessAttributes('extra_attributes'); + $table->json('keypair')->nullable(); + $table->timestamp('onboarded_at')->nullable(); + $table->timestamps(); + $table->softDeletes(); + }); + + Schema::create('token_users', function (Blueprint $table) { + $table->foreignId('token_id')->constrained()->cascadeOnDelete(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->string('role', 20); + $table->json('permissions'); + $table->timestamps(); + + $table->unique(['token_id', 'user_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::dropIfExists('token_users'); + Schema::dropIfExists('tokens'); + } +} diff --git a/database/migrations/2020_01_16_100000_create_server_providers_table.php b/database/migrations/2020_01_16_100000_create_server_providers_table.php new file mode 100644 index 0000000..701e666 --- /dev/null +++ b/database/migrations/2020_01_16_100000_create_server_providers_table.php @@ -0,0 +1,92 @@ +bigIncrements('id'); + $table->foreignId('token_id')->constrained()->cascadeOnDelete(); + $table->string('type'); + $table->string('name'); + $table->unique(['token_id', 'name']); + $table->string('provider_key_id')->nullable(); + $table->schemalessAttributes('extra_attributes'); + $table->timestamps(); + }); + + Schema::create('server_provider_plans', function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('uuid'); + $table->unsignedInteger('disk'); + $table->unsignedInteger('memory'); + $table->unsignedInteger('cores'); + $table->json('regions'); + $table->timestamps(); + + $table->unique(['uuid']); + }); + + Schema::create('server_provider_server_provider_plan', function (Blueprint $table) { + $table->foreignId('server_provider_id')->constrained()->cascadeOnDelete(); + $table->foreignId('server_provider_plan_id')->constrained()->cascadeOnDelete(); + + $table->unique(['server_provider_id', 'server_provider_plan_id']); + }); + + Schema::create('server_provider_regions', function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('uuid'); + $table->string('name'); + $table->timestamps(); + + $table->unique(['uuid']); + }); + + Schema::create('server_provider_server_provider_region', function (Blueprint $table) { + $table->foreignId('server_provider_id')->constrained()->cascadeOnDelete(); + $table->foreignId('server_provider_region_id')->constrained()->cascadeOnDelete(); + + $table->unique(['server_provider_id', 'server_provider_region_id']); + }); + + Schema::create('server_provider_images', function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('uuid'); + $table->string('name'); + $table->timestamps(); + + $table->unique(['uuid']); + }); + + Schema::create('server_provider_server_provider_image', function (Blueprint $table) { + $table->foreignId('server_provider_id')->constrained()->cascadeOnDelete(); + $table->foreignId('server_provider_image_id')->constrained()->cascadeOnDelete(); + + $table->unique(['server_provider_id', 'server_provider_image_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::dropIfExists('server_provider_server_provider_plan'); + Schema::dropIfExists('server_provider_server_provider_region'); + Schema::dropIfExists('server_provider_server_provider_image'); + Schema::dropIfExists('server_provider_plans'); + Schema::dropIfExists('server_provider_regions'); + Schema::dropIfExists('server_provider_images'); + Schema::dropIfExists('server_providers'); + } +} diff --git a/database/migrations/2020_01_16_300000_create_networks_table.php b/database/migrations/2020_01_16_300000_create_networks_table.php new file mode 100644 index 0000000..17948f4 --- /dev/null +++ b/database/migrations/2020_01_16_300000_create_networks_table.php @@ -0,0 +1,31 @@ +bigIncrements('id'); + $table->foreignId('token_id')->constrained()->cascadeOnDelete(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::dropIfExists('networks'); + } +} diff --git a/database/migrations/2020_01_16_400000_create_servers_table.php b/database/migrations/2020_01_16_400000_create_servers_table.php new file mode 100644 index 0000000..0fd00b6 --- /dev/null +++ b/database/migrations/2020_01_16_400000_create_servers_table.php @@ -0,0 +1,46 @@ +bigIncrements('id'); + $table->foreignId('network_id')->constrained()->cascadeOnDelete(); + $table->foreignId('server_provider_id')->constrained()->cascadeOnDelete(); + $table->foreignId('server_provider_plan_id')->constrained(); + $table->foreignId('server_provider_region_id')->constrained(); + $table->foreignId('server_provider_image_id')->constrained(); + $table->string('name'); + $table->text('user_password')->nullable(); + $table->text('sudo_password')->nullable(); + $table->text('delegate_passphrase')->nullable(); + $table->text('delegate_password')->nullable(); + $table->unsignedInteger('provider_server_id')->nullable(); + $table->ipAddress('ip_address')->nullable(); + $table->timestamp('provisioning_job_dispatched_at')->nullable(); + $table->timestamp('provisioned_at')->nullable(); + $table->string('preset'); + $table->string('core_version')->nullable(); + $table->schemalessAttributes('extra_attributes'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::dropIfExists('servers'); + } +} diff --git a/database/migrations/2020_01_16_500000_create_secure_shell_keys_table.php b/database/migrations/2020_01_16_500000_create_secure_shell_keys_table.php new file mode 100644 index 0000000..7ec7899 --- /dev/null +++ b/database/migrations/2020_01_16_500000_create_secure_shell_keys_table.php @@ -0,0 +1,37 @@ +bigIncrements('id'); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->string('name'); + $table->text('public_key'); + $table->string('fingerprint'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('secure_shell_keys'); + } +} diff --git a/database/migrations/2020_01_17_100000_create_invitations_table.php b/database/migrations/2020_01_17_100000_create_invitations_table.php new file mode 100644 index 0000000..e7dfba7 --- /dev/null +++ b/database/migrations/2020_01_17_100000_create_invitations_table.php @@ -0,0 +1,39 @@ +bigIncrements('id'); + $table->uuid('uuid'); + $table->foreignId('token_id')->constrained()->cascadeOnDelete(); + $table->foreignId('user_id')->cascadeOnDelete()->nullable(); + $table->string('email'); + $table->string('role'); + $table->json('permissions'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('invitations'); + } +} diff --git a/database/migrations/2020_01_22_052713_create_media_table.php b/database/migrations/2020_01_22_052713_create_media_table.php new file mode 100644 index 0000000..26c1509 --- /dev/null +++ b/database/migrations/2020_01_22_052713_create_media_table.php @@ -0,0 +1,45 @@ +bigIncrements('id'); + + $table->morphs('model'); + $table->uuid('uuid')->nullable()->unique(); + $table->string('collection_name'); + $table->string('name'); + $table->string('file_name'); + $table->string('mime_type')->nullable(); + $table->string('disk'); + $table->string('conversions_disk')->nullable(); + $table->unsignedBigInteger('size'); + $table->json('manipulations'); + $table->json('custom_properties'); + $table->json('generated_conversions'); + $table->json('responsive_images'); + $table->unsignedInteger('order_column')->nullable(); + + $table->nullableTimestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::dropIfExists('media'); + } +} diff --git a/database/migrations/2020_02_05_030355_create_server_tasks_table.php b/database/migrations/2020_02_05_030355_create_server_tasks_table.php new file mode 100644 index 0000000..6b19d1a --- /dev/null +++ b/database/migrations/2020_02_05_030355_create_server_tasks_table.php @@ -0,0 +1,41 @@ +bigIncrements('id'); + $table->foreignId('server_id')->constrained()->cascadeOnDelete(); + $table->string('type'); + $table->string('name'); + $table->string('user'); + $table->integer('exit_code')->nullable(); + $table->longText('script'); + $table->longText('output'); + $table->json('options'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('server_tasks'); + } +} diff --git a/database/migrations/2020_05_20_114046_create_token_secure_shell_keys.php b/database/migrations/2020_05_20_114046_create_token_secure_shell_keys.php new file mode 100644 index 0000000..fad966a --- /dev/null +++ b/database/migrations/2020_05_20_114046_create_token_secure_shell_keys.php @@ -0,0 +1,35 @@ +foreignId('token_id')->constrained()->cascadeOnDelete(); + $table->foreignId('secure_shell_key_id')->constrained()->cascadeOnDelete(); + + $table->unique(['token_id', 'secure_shell_key_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('secure_shell_key_token'); + } +} diff --git a/database/migrations/2020_09_16_135202_add_uuid_to_failed_jobs_table.php b/database/migrations/2020_09_16_135202_add_uuid_to_failed_jobs_table.php new file mode 100644 index 0000000..b1895b7 --- /dev/null +++ b/database/migrations/2020_09_16_135202_add_uuid_to_failed_jobs_table.php @@ -0,0 +1,34 @@ +string('uuid')->after('id')->nullable()->unique(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('failed_jobs', function (Blueprint $table) { + $table->dropColumn('uuid'); + }); + } +} diff --git a/database/migrations/2020_10_21_171258_add_last_login_at_to_users_table.php b/database/migrations/2020_10_21_171258_add_last_login_at_to_users_table.php new file mode 100644 index 0000000..83dcd5d --- /dev/null +++ b/database/migrations/2020_10_21_171258_add_last_login_at_to_users_table.php @@ -0,0 +1,17 @@ +timestamp('last_login_at')->nullable(); + }); + } +} diff --git a/database/migrations/2020_11_17_000000_create_notifications_table.php b/database/migrations/2020_11_17_000000_create_notifications_table.php new file mode 100644 index 0000000..3606971 --- /dev/null +++ b/database/migrations/2020_11_17_000000_create_notifications_table.php @@ -0,0 +1,25 @@ +uuid('id')->primary(); + $table->string('type'); + $table->morphs('notifiable'); + $table->morphs('relatable'); + $table->nullableMorphs('relatable_logo'); + $table->text('data'); + $table->timestamp('read_at')->nullable(); + $table->boolean('is_starred')->default(false); + $table->timestamps(); + }); + } +} diff --git a/database/migrations/2022_01_26_092328_add_event_column_to_activity_log_table.php b/database/migrations/2022_01_26_092328_add_event_column_to_activity_log_table.php new file mode 100644 index 0000000..742e420 --- /dev/null +++ b/database/migrations/2022_01_26_092328_add_event_column_to_activity_log_table.php @@ -0,0 +1,24 @@ +table(config('activitylog.table_name'), function (Blueprint $table) { + $table->string('event')->nullable()->after('subject_type'); + }); + } + + public function down() + { + Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { + $table->dropColumn('event'); + }); + } +} diff --git a/database/migrations/2022_01_26_092329_add_batch_uuid_column_to_activity_log_table.php b/database/migrations/2022_01_26_092329_add_batch_uuid_column_to_activity_log_table.php new file mode 100644 index 0000000..ad42e5b --- /dev/null +++ b/database/migrations/2022_01_26_092329_add_batch_uuid_column_to_activity_log_table.php @@ -0,0 +1,24 @@ +table(config('activitylog.table_name'), function (Blueprint $table) { + $table->uuid('batch_uuid')->nullable()->after('properties'); + }); + } + + public function down() + { + Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { + $table->dropColumn('batch_uuid'); + }); + } +} diff --git a/database/migrations/2022_06_06_211404_add_deleted_at_column_to_server_providers_table.php b/database/migrations/2022_06_06_211404_add_deleted_at_column_to_server_providers_table.php new file mode 100644 index 0000000..9197209 --- /dev/null +++ b/database/migrations/2022_06_06_211404_add_deleted_at_column_to_server_providers_table.php @@ -0,0 +1,21 @@ +softDeletes(); + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..df9ecc9 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,19 @@ + + + + + ./tests/Analysis + + + ./tests/App + + + ./tests/Domain + + + ./tests/Support + + + + + ./app + + ./app/App/Console/Playbooks + ./app/App/Console/Commands/RunPlaybookCommand.php + ./app/App/Exceptions + ./app/App/Nova + ./app/App/Providers + ./app/App/User/Controllers/Auth + ./app/Support/Eloquent/Concerns + ./app/App/BaseApplication.php + ./app/App/Console/Kernel.php + ./app/App/Token/Requests/UpdateTokenLogoRequest.php + ./app/App/User/Requests/UpdateUserPhotoRequest.php + ./app/Console/Kernel.php + ./app/Domain/Server/Services/Providers/AWS.php + ./app/Support/Components/Component.php + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..a8e7929 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,63 @@ + + + + + ./tests/Analysis + + + ./tests/App + + + ./tests/Domain + + + ./tests/Support + + + + + ./app + + ./app/App/Console/Playbooks + ./app/App/Console/Commands/RunPlaybookCommand.php + ./app/App/Exceptions + ./app/App/Nova + ./app/App/Providers + ./app/App/User/Controllers/Auth + ./app/Support/Eloquent/Concerns + ./app/App/BaseApplication.php + ./app/App/Console/Kernel.php + ./app/App/Token/Requests/UpdateTokenLogoRequest.php + ./app/App/User/Requests/UpdateUserPhotoRequest.php + ./app/Console/Kernel.php + ./app/Domain/Server/Services/Providers/AWS.php + ./app/Support/Components/Component.php + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..aaf2520 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..3aec5e2 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..e796fd7cfc40a20d2b85c4ac2bc9ee85f4547f11 GIT binary patch literal 9853 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 literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb678b59868765a95a315b57786e641516b94bd GIT binary patch literal 9127 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 + + + + + #5452ce + + + diff --git a/public/css/app.css b/public/css/app.css new file mode 100644 index 0000000..c634f0e --- /dev/null +++ b/public/css/app.css @@ -0,0 +1,99 @@ +/*! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}#newsletter input[type=email]{border-bottom-left-radius:.25rem!important;border-bottom-right-radius:0!important;border-style:none!important;border-top-left-radius:.25rem!important;border-top-right-radius:0!important}#newsletter button[type=submit]{border-bottom-left-radius:0!important;border-bottom-right-radius:.25rem!important;border-top-left-radius:0!important;border-top-right-radius:.25rem!important;padding-left:1rem!important;padding-right:1rem!important}#newsletter button[type=submit].focus-visible,.button-pagination-page-indicator--selected.focus-visible,.button-pagination-page-indicator.focus-visible,.review-content a.focus-visible,a.link.focus-visible,a[dusk*=navbar-item-].focus-visible,button.link.focus-visible{border-radius:.25rem}#newsletter button[type=submit]:focus-visible,.button-pagination-page-indicator--selected:focus-visible,.button-pagination-page-indicator:focus-visible,.review-content a:focus-visible,a.link:focus-visible,a[dusk*=navbar-item-]:focus-visible,button.link:focus-visible{border-radius:.25rem}[role=button],a,button,label.tile-selection-option input{outline:2px solid transparent;outline-offset:2px}[role=button].focus-visible,a.focus-visible,button.focus-visible,label.tile-selection-option input.focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:var(--theme-color-primary-500);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);-webkit-text-decoration-line:none;text-decoration-line:none;transition-property:none;z-index:10}[role=button]:focus-visible,a:focus-visible,button:focus-visible,label.tile-selection-option input:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:var(--theme-color-primary-500);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);-webkit-text-decoration-line:none;text-decoration-line:none;transition-property:none;z-index:10}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}@media (min-width:1550px){.container{max-width:1550px}}.documentation-sidebar .alert-wrapper .alert-content-wrapper+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.alert-wrapper .alert-content-wrapper{border-radius:.75rem;display:flex;flex-direction:column;overflow:hidden}.documentation-sidebar .alert-wrapper .alert-title+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.alert-wrapper .alert-title{align-items:center;display:flex;margin:0;padding:.5rem 1rem}.alert-wrapper .alert-title .alert-icon{display:inline-flex;height:.875rem;margin-right:.5rem;width:.875rem}.alert-wrapper .alert-title span{font-size:.875rem;font-weight:600;line-height:1.25rem;line-height:1}.alert-wrapper .alert-title button{color:var(--theme-color-secondary-900);display:inline-flex;margin-left:auto}.alert-wrapper .alert-title button svg{display:inline-flex;height:.875rem;width:.875rem}.alert-wrapper.alert-info .alert-title{background-color:var(--theme-color-info-100);color:var(--theme-color-info-700)}.alert-wrapper.alert-success .alert-title{background-color:var(--theme-color-success-100);color:var(--theme-color-success-700)}.alert-wrapper.alert-warning .alert-title{background-color:var(--theme-color-warning-100);color:var(--theme-color-warning-900)}.alert-wrapper.alert-error .alert-title{background-color:var(--theme-color-danger-100);color:var(--theme-color-danger-700)}.alert-wrapper.alert-hint .alert-title{background-color:var(--theme-color-hint-100);color:var(--theme-color-hint-700)}.alert-wrapper .alert-content{color:var(--theme-color-secondary-900);font-size:.875rem;line-height:1.5rem;padding:1rem}.alert-wrapper.alert-info .alert-content{background-color:var(--theme-color-info-50)}.alert-wrapper.alert-success .alert-content{background-color:var(--theme-color-success-50)}.alert-wrapper.alert-warning .alert-content{background-color:var(--theme-color-warning-50)}.alert-wrapper.alert-error .alert-content{background-color:var(--theme-color-danger-50)}.alert-wrapper.alert-hint .alert-content{background-color:var(--theme-color-hint-50)}.dark .alert-wrapper .alert-title{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark .alert-wrapper .alert-title button{color:var(--theme-color-secondary-200)}.dark .alert-wrapper.alert-info .alert-title{background-color:var(--theme-color-info-700)}.dark .alert-wrapper.alert-success .alert-title{background-color:var(--theme-color-success-700)}.dark .alert-wrapper.alert-warning .alert-title{background-color:var(--theme-color-warning-700)}.dark .alert-wrapper.alert-error .alert-title{background-color:var(--theme-color-danger-500)}.dark .alert-wrapper.alert-hint .alert-title{background-color:var(--theme-color-hint-700)}.dark .alert-wrapper .alert-content-wrapper>.alert-title~.alert-content{color:var(--theme-color-secondary-200)}.dark .alert-wrapper.alert-error .alert-content-wrapper>.alert-title~.alert-content,.dark .alert-wrapper.alert-hint .alert-content-wrapper>.alert-title~.alert-content,.dark .alert-wrapper.alert-info .alert-content-wrapper>.alert-title~.alert-content,.dark .alert-wrapper.alert-success .alert-content-wrapper>.alert-title~.alert-content,.dark .alert-wrapper.alert-warning .alert-content-wrapper>.alert-title~.alert-content{background-color:var(--theme-color-secondary-800)}.button-generic,.button-primary{border-radius:.25rem;font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}a.button-primary{display:inline-block}.button-primary{--tw-text-opacity:1;background-color:var(--theme-color-primary-600);color:rgb(255 255 255/var(--tw-text-opacity))}.button-primary:hover{background-color:var(--theme-color-primary-700)}.button-cancel:disabled,.button-disabled,.button-icon-rounded:disabled,.button-icon:disabled,.button-primary:disabled,.button-secondary:disabled,.button-tertiary:disabled,a.disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.button-outline.button-disabled,.button-outline:disabled,.button-tag-outline.button-disabled,.button-tag-outline:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;border-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.dark .button-cancel:disabled,.dark .button-disabled,.dark .button-icon-rounded:disabled,.dark .button-icon:disabled,.dark .button-primary:disabled,.dark .button-secondary:disabled,.dark .button-tertiary:disabled,.dark a.disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}.dark .button-outline.button-disabled,.dark .button-outline:disabled,.dark .button-tag-outline.button-disabled,.dark .button-tag-outline:disabled{border-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}.button-secondary{border-radius:.25rem;font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}a.button-secondary{display:inline-block}.button-secondary{background-color:var(--theme-color-primary-100);color:var(--theme-color-primary-600)}.button-cancel{border-radius:.25rem;font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}a.button-cancel{display:inline-block}.button-cancel{background-color:var(--theme-color-danger-100);color:var(--theme-color-danger-400)}.dark .button-cancel{--tw-text-opacity:1;background-color:var(--theme-color-danger-400);color:rgb(255 255 255/var(--tw-text-opacity))}.dark .button-cancel:hover{background-color:var(--theme-color-danger-500)}.button-icon:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.dark .button-icon:disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}.button-icon{background-color:var(--theme-color-primary-100);border-radius:.25rem;color:var(--theme-color-primary-600);font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}.dark .button-icon{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-200)}.button-icon:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.button-icon:hover,.dark .button-icon:hover{background-color:var(--theme-color-primary-700)}.dark .button-icon:hover{color:var(--theme-color-secondary-200)}a.button-icon{display:inline-block}.dark .button-icon:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.documentation-content a.button-icon:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.documentation-content .page-ref .button-icon{border-radius:0}.button-icon-cancel:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.dark .button-icon-cancel:disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}.button-icon-cancel{border-radius:.25rem;font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}a.button-icon-cancel{display:inline-block}.button-icon-cancel{background-color:var(--theme-color-danger-100);color:var(--theme-color-danger-400)}.dark .button-icon-cancel{--tw-text-opacity:1;background-color:var(--theme-color-danger-400);color:rgb(255 255 255/var(--tw-text-opacity))}.dark .button-icon-cancel:hover{background-color:var(--theme-color-danger-500)}.button-icon-cancel:hover{--tw-text-opacity:1;background-color:var(--theme-color-danger-400);color:rgb(255 255 255/var(--tw-text-opacity))}.documentation-sidebar .button-icon+h2:not(.documentation-sidebar h2:first-of-type),.documentation-sidebar .button-icon-cancel+h2:not(.documentation-sidebar h2:first-of-type),.documentation-sidebar .button-icon-primary+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.button-icon,.button-icon-cancel,.button-icon-primary{align-items:center;display:flex;justify-content:center;padding:0}.dark .button-icon,.dark .button-icon-rounded,.dark .button-secondary,.dark .button-tag{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-200)}.dark .button-outline,.dark .button-tag-outline{border-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-200)}.button-icon-rounded:hover,.button-icon:hover,.button-secondary:hover,.button-tag:hover{--tw-text-opacity:1;background-color:var(--theme-color-primary-700);color:rgb(255 255 255/var(--tw-text-opacity))}.dark .button-icon-rounded:hover,.dark .button-icon:hover,.dark .button-secondary:hover,.dark .button-tag:hover{background-color:var(--theme-color-primary-700);color:var(--theme-color-secondary-200)}.dark .button-outline:hover,.dark .button-tag-outline:hover{border-color:var(--theme-color-primary-700);color:var(--theme-color-secondary-200)}.button-cancel:hover,.button-icon-cancel:hover{--tw-text-opacity:1;background-color:var(--theme-color-danger-400);color:rgb(255 255 255/var(--tw-text-opacity))}a.button-generic,a.button-primary,a.button-secondary,a.button-tertiary{display:inline-block}.button-pagination-page-indicator{background-color:var(--theme-color-primary-100);color:var(--theme-color-primary-600);font-weight:600;padding:.625rem .5rem;text-align:center;transition:all .1s ease-in}.button-pagination-page-indicator .button-pagination-ellipsis,.button-pagination-page-indicator .button-pagination-search{transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.button-pagination-page-indicator .button-pagination-search{margin-top:.25rem;position:absolute}.button-pagination-page-indicator .button-pagination-ellipsis,.button-pagination-page-indicator:hover .button-pagination-search{opacity:1}.button-pagination-page-indicator .button-pagination-search,.button-pagination-page-indicator:hover .button-pagination-ellipsis{opacity:0}.dark .button-pagination-page-indicator{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-200)}.button-pagination-page-indicator--selected{background-color:var(--theme-color-primary-200);color:var(--theme-color-primary-600);font-weight:600;padding:.625rem .5rem;text-align:center;transition:all .1s ease-in}.dark .button-pagination-page-indicator--selected{background-color:var(--theme-color-secondary-600);color:var(--theme-color-secondary-200);font-weight:600;padding:.625rem .5rem;text-align:center;transition:all .1s ease-in}.button-pagination-page-indicator:hover{--tw-text-opacity:1;background-color:var(--theme-color-primary-700);border-radius:.25rem;color:rgb(255 255 255/var(--tw-text-opacity));transform:scale(1.2)}.dark .button-pagination-page-indicator:hover:not([disabled]){background-color:var(--theme-color-primary-600)}.dark .button-icon-primary:hover,.dark .button-icon-rounded:hover,.dark .button-icon:hover,.dark .button-primary:hover,.dark .button-secondary:hover,.dark .button-tertiary:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.view-option-button{position:relative}.view-option-button.active:not(.focus-visible):before{background-color:var(--theme-color-primary-600);bottom:0;content:"";height:3px;left:0;position:absolute;right:0}.view-option-button.active:not(:focus-visible):before{background-color:var(--theme-color-primary-600);bottom:0;content:"";height:3px;left:0;position:absolute;right:0}code.hljs{border-radius:.75rem;font-family:FiraMono;padding:1.5rem 2rem}code.hljs .hljs-ln-n{padding-right:1rem;text-align:right}.table-container table>tbody>tr>tdcode.hoverable-cell.hljs .hljs-ln-n>div.table-cell-content{justify-content:flex-end}.documentation-content{color:var(--theme-color-secondary-700);overflow-wrap:break-word}.dark .documentation-content{color:var(--theme-color-secondary-500)}.documentation-content h1{margin-bottom:2rem}.documentation-content h2{border-color:var(--theme-color-secondary-200);border-top-width:1px;margin-bottom:1rem;margin-top:1.5rem;padding-top:1.5rem}.dark .documentation-content h2{border-color:var(--theme-color-secondary-800)}.documentation-content h3{margin-bottom:1rem}@media (min-width:640px){.documentation-content h2{margin-top:2.5rem;padding-top:2.5rem}}.documentation-content .alert-wrapper,.documentation-content .embed-link,.documentation-content .grid-gallery,.documentation-content .link-collection,.documentation-content .page-ref,.documentation-content .table-wrapper,.documentation-content :not(.table-wrapper) table,.documentation-content ol,.documentation-content pre,.documentation-content summary,.documentation-content ul{margin-bottom:1.5rem}.documentation-content .accordion .table-wrapper,.documentation-content .accordion table{margin-bottom:0}.documentation-content p{line-height:1.75rem;margin-bottom:1.5rem}.documentation-content .alert-content-wrapper p{margin-bottom:0}.documentation-content code{background-color:var(--theme-color-secondary-200);border-radius:.25rem;color:var(--theme-color-secondary-900);font-weight:400;padding:.25rem .5rem}.dark .documentation-content code{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-400)}.documentation-content pre.hljs{margin-bottom:0!important}.documentation-content pre.hljs>code{background-color:inherit!important;color:inherit!important;padding:0!important}.documentation-content a{color:var(--theme-color-primary-600);font-weight:600;-webkit-text-decoration-line:none;text-decoration-line:none;transition:all .1s ease-in}.simple-markdown a:is(.documentation-content a):hover{text-decoration:none}.documentation-content a[target=_blank]:hover{-webkit-text-decoration-line:none;text-decoration-line:none}.simple-markdown a:is(.documentation-content a[target=_blank]:hover):hover{text-decoration:none}.documentation-content a:hover,.documentation-content a[target=_blank]:hover>span{-webkit-text-decoration-line:underline;text-decoration-line:underline}.documentation-content a:hover{color:var(--theme-color-primary-700)}.documentation-content a:active{color:var(--theme-color-primary-400)}.documentation-content ul{list-style-position:outside;list-style-type:disc;padding-left:1rem}.documentation-content ol{list-style-position:outside;list-style-type:decimal;padding-left:1rem}.documentation-content ol ul,.documentation-content ul ul{list-style-position:outside;list-style-type:circle;margin-bottom:0;margin-left:1rem}.documentation-content ol ol,.documentation-content ul ol{list-style-position:outside;list-style-type:lower-latin;margin-bottom:0;margin-left:1rem}.documentation-content ol>li,.documentation-content ul>li{padding-bottom:.5rem}.documentation-content hr:not(.custom-separator){background-color:var(--theme-color-secondary-300);border-color:var(--theme-color-secondary-300);margin-bottom:1.5rem;margin-top:1.5rem}.dark .documentation-content hr:not(.custom-separator){background-color:var(--theme-color-secondary-800);border-color:var(--theme-color-secondary-800)}.documentation-content img{display:block;margin-left:auto;margin-right:auto}.documentation-sidebar .documentation-content .image-container+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.documentation-content .image-container{align-items:center;display:flex;flex-direction:column}.documentation-content .video-container{width:100%}.documentation-content .image-container .twitter-tweet,.documentation-content .typeform-widget,.documentation-content iframe,.documentation-content img{border-color:var(--theme-color-secondary-300);border-radius:.75rem;border-width:1px;overflow:hidden}.dark .documentation-content .image-container .twitter-tweet,.dark .documentation-content .typeform-widget,.dark .documentation-content iframe,.dark .documentation-content img{border-color:var(--theme-color-secondary-800)}.documentation-content>.twitter-tweet{margin-left:auto;margin-right:auto}.documentation-content .image-container .twitter-tweet{max-width:548px;overflow:hidden}.documentation-content .image-container .twitter-tweet iframe{border-width:0;margin:-1px}.documentation-content .image-caption{border-color:var(--theme-color-secondary-300);border-left-width:2px;color:var(--theme-color-secondary-800);display:block;font-size:.875rem;font-style:italic;line-height:1.25rem;margin-left:auto;margin-right:auto;margin-top:.75rem;padding-left:.75rem;padding-right:.75rem;position:relative;text-align:center}.dark .documentation-content .image-caption{border-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-200)}.documentation-content .image-caption .external-link svg{height:.625rem;margin-top:-.25rem;width:.625rem}.documentation-content .embed-link a:hover{-webkit-text-decoration-line:none;text-decoration-line:none}.simple-markdown a:is(.documentation-content .embed-link a:hover):hover{text-decoration:none}.documentation-content .embed-link img{border-style:none}.documentation-content a.button-secondary:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.documentation-content .page-ref h3{margin-bottom:0}.documentation-content .page-ref .button-secondary{border-radius:0}.documentation-content blockquote{border-color:var(--theme-color-secondary-300);border-left-width:2px;color:var(--theme-color-secondary-500);display:block;padding-left:1rem}.dark .documentation-content blockquote{border-color:var(--theme-color-secondary-700);color:var(--theme-color-secondary-700)}.documentation-content table{text-align:left;width:100%}.table-container table>tbody>tr>td.hoverable-cell:is(.documentation-content table)>div.table-cell-content{justify-content:flex-start}.documentation-content table thead{color:var(--theme-color-secondary-500);font-size:.875rem;font-weight:600;line-height:1.25rem}.documentation-content table thead tr{border-bottom-width:1px;border-color:var(--theme-color-secondary-300);text-align:left}.table-container table>tbody>tr>td.hoverable-cell:is(.documentation-content table thead tr)>div.table-cell-content{justify-content:flex-start}.dark .documentation-content table thead tr{border-color:var(--theme-color-secondary-800)}.documentation-content table thead th{padding:.75rem;position:relative}.documentation-content table thead th:not(:last-child):after{border-color:var(--theme-color-secondary-300);border-left-width:1px;content:"";height:50%;position:absolute;right:0}.dark .documentation-content table thead th:not(:last-child):after{border-color:var(--theme-color-secondary-800)}.documentation-content table tbody td{line-height:1.25rem;padding:1rem .75rem}.documentation-content table tbody tr{border-bottom:1px var(--theme-color-secondary-300);border-left-color:var(--theme-color-secondary-300);border-right-color:var(--theme-color-secondary-300);border-style:dashed;border-top-color:var(--theme-color-secondary-300)}.dark .documentation-content table tbody tr{border-color:var(--theme-color-secondary-800)}.documentation-content table tbody tr:last-child{border-width:0}.documentation-content .table-wrapper{scrollbar-color:#e5f0f8 #bad6f0}.documentation-content .table-wrapper::-webkit-scrollbar{background-color:var(--theme-color-primary-100);border-radius:.5rem;height:6px;width:6px}.documentation-content .table-wrapper::-webkit-scrollbar-thumb{background-color:var(--theme-color-primary-200);border-radius:.5rem}.documentation-sidebar .flex+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.mobile-menu.documentation-sidebar h2 .heading-permalink{display:none}.mobile-menu.documentation-sidebar h2:first-child{border-width:0;margin-top:0;padding-top:.5rem}.documentation-content .heading-permalink,aside .heading-permalink{scroll-margin-top:120px}.documentation-content h2 .heading-permalink,.documentation-content h3 .heading-permalink,.documentation-content h4 .heading-permalink,main .documentation-content .heading-permalink{color:var(--theme-color-primary-600);margin-right:.75rem;transition:all .1s ease-in}.documentation-content h2 .heading-permalink:hover,.documentation-content h3 .heading-permalink:hover,.documentation-content h4 .heading-permalink:hover,main .documentation-content .heading-permalink:hover{color:var(--theme-color-primary-700);-webkit-text-decoration-line:none;text-decoration-line:none}.simple-markdown a:is(.documentation-content h2 .heading-permalink:hover):hover,.simple-markdown a:is(.documentation-content h3 .heading-permalink:hover):hover,.simple-markdown a:is(.documentation-content h4 .heading-permalink:hover):hover,.simple-markdown a:is(main .documentation-content .heading-permalink:hover):hover{text-decoration:none}.documentation-content .grid-gallery{display:grid;gap:1rem;grid-auto-flow:row;grid-template-columns:repeat(2,minmax(0,1fr))}.swiper-wrapper.documentation-content .grid-gallery .swiper-slide:nth-child(n+2){display:none}@media (min-width:640px){.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.documentation-content .grid-gallery.sm\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:768px){.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.documentation-content .grid-gallery.md\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1024px){.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.documentation-content .grid-gallery.lg\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1280px){.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.documentation-content .grid-gallery.xl\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:640px){.documentation-content .grid-gallery{grid-template-columns:repeat(3,minmax(0,1fr))}}.documentation-content .grid-gallery p{margin-bottom:0}.custom-code-block .hljs{overflow-x:auto}.documentation-content dl{line-height:1.75rem}.documentation-content dl dt{font-weight:600;padding-bottom:.25rem}.documentation-content dl dd{padding-bottom:1.5rem}.toast{align-items:center;border-radius:.75rem;color:var(--theme-color-secondary-900);display:inline-flex;flex-direction:column;font-size:.875rem;line-height:1.25rem;max-width:56rem;padding:1rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dark .toast{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-500)}@media (min-width:640px){.toast{flex-direction:row}.toast>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}}.toast-body{margin-top:1rem;text-align:center}@media (min-width:640px){.toast-body{margin-top:0;padding-right:1.5rem;text-align:left}}.documentation-sidebar .toast-icon+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.toast-icon{--tw-text-opacity:1;align-items:center;border-radius:.25rem;color:rgb(255 255 255/var(--tw-text-opacity));display:flex;flex-shrink:0;height:2.75rem;justify-content:center;width:2.75rem}.documentation-sidebar .toast-button+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.toast-button{align-items:center;border-radius:.25rem;color:var(--theme-color-secondary-900);display:flex;flex-shrink:0;height:2.75rem;justify-content:center;margin:1rem;position:absolute;right:0;top:0;width:2.75rem}@media (min-width:640px){.toast-button{margin:0;position:relative;right:auto;top:auto}}.toast-info{background-color:var(--theme-color-primary-50)}.toast-warning{background-color:var(--theme-color-warning-50)}.toast-danger{background-color:var(--theme-color-danger-50)}.toast-hint{background-color:var(--theme-color-hint-50)}.toast-success{background-color:var(--theme-color-success-50)}.toast-info .toast-icon{background-color:var(--theme-color-primary-600)}.toast-warning .toast-icon{background-color:var(--theme-color-warning-600)}.toast-danger .toast-icon{background-color:var(--theme-color-danger-400)}.toast-hint .toast-icon{background-color:var(--theme-color-hint-500)}.toast-success .toast-icon{background-color:var(--theme-color-success-600)}.toast-info .toast-button{background-color:var(--theme-color-primary-100)}.toast-info .toast-button:hover{background-color:var(--theme-color-primary-200)}.dark .toast-info .toast-button{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-600)}.dark .toast-info .toast-button:hover{background-color:var(--theme-color-secondary-500);color:var(--theme-color-secondary-400)}.toast-warning .toast-button{background-color:var(--theme-color-warning-100)}.toast-warning .toast-button:hover{background-color:var(--theme-color-warning-200)}.dark .toast-warning .toast-button{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-600)}.dark .toast-warning .toast-button:hover{background-color:var(--theme-color-secondary-500);color:var(--theme-color-secondary-400)}.toast-danger .toast-button{background-color:var(--theme-color-danger-100)}.toast-danger .toast-button:hover{background-color:var(--theme-color-danger-200)}.dark .toast-danger .toast-button{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-600)}.dark .toast-danger .toast-button:hover{background-color:var(--theme-color-secondary-500);color:var(--theme-color-secondary-400)}.toast-hint .toast-button{background-color:var(--theme-color-hint-100)}.toast-hint .toast-button:hover{background-color:var(--theme-color-hint-200)}.dark .toast-hint .toast-button{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-600)}.dark .toast-hint .toast-button:hover{background-color:var(--theme-color-secondary-500);color:var(--theme-color-secondary-400)}.toast-success .toast-button{background-color:var(--theme-color-success-100)}.toast-success .toast-button:hover{background-color:var(--theme-color-success-200)}.dark .toast-success .toast-button{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-600)}.dark .toast-success .toast-button:hover{background-color:var(--theme-color-secondary-500);color:var(--theme-color-secondary-400)}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{bottom:0;left:0;right:0;top:0}.inset-2{bottom:.5rem;left:.5rem;right:.5rem;top:.5rem}.inset-y-0{bottom:0;top:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.bottom-0{bottom:0}.-top-1{top:-.25rem}.-left-2\.5px{left:-2.5px}.-left-2{left:-.5rem}.top-32{top:8rem}.top-1{top:.25rem}.right-1{right:.25rem}.bottom-5{bottom:1.25rem}.-top-10{top:-2.5rem}.right-13{right:3.25rem}.top-21{top:5.25rem}.top-2{top:.5rem}.right-2{right:.5rem}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.z-40{z-index:40}.z-50{z-index:50}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-0{z-index:0}.m-0{margin:0}.m-auto{margin:auto}.-m-4{margin:-1rem}.-m-3{margin:-.75rem}.-m-1{margin:-.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-auto{margin-bottom:auto;margin-top:auto}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.-mx-8{margin-left:-2rem;margin-right:-2rem}.my-4{margin-bottom:1rem;margin-top:1rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.my-1{margin-bottom:.25rem;margin-top:.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-bottom:2rem;margin-top:2rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-6{margin-bottom:1.5rem;margin-top:1.5rem}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-0{margin-left:0;margin-right:0}.-my-px{margin-bottom:-1px;margin-top:-1px}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-5{margin-bottom:1.25rem;margin-top:1.25rem}.my-7{margin-bottom:1.75rem;margin-top:1.75rem}.-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mt-8{margin-top:2rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mr-6{margin-right:1.5rem}.mt-1{margin-top:.25rem}.ml-3{margin-left:.75rem}.mb-8{margin-bottom:2rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.ml-2{margin-left:.5rem}.mb-1\.5{margin-bottom:.375rem}.mb-1{margin-bottom:.25rem}.mt-3{margin-top:.75rem}.mr-2{margin-right:.5rem}.ml-1{margin-left:.25rem}.-mt-8{margin-top:-2rem}.mt-0{margin-top:0}.ml-10{margin-left:2.5rem}.mt-10{margin-top:2.5rem}.mr-10{margin-right:2.5rem}.mb-6{margin-bottom:1.5rem}.mb-5{margin-bottom:1.25rem}.mt-5{margin-top:1.25rem}.mb-2{margin-bottom:.5rem}.mr-4{margin-right:1rem}.-mt-4{margin-top:-1rem}.mt-0\.5{margin-top:.125rem}.ml-5{margin-left:1.25rem}.mb-16{margin-bottom:4rem}.ml-6{margin-left:1.5rem}.mr-3{margin-right:.75rem}.mr-5{margin-right:1.25rem}.-mt-1\.5{margin-top:-.375rem}.-mt-1{margin-top:-.25rem}.ml-0\.5{margin-left:.125rem}.ml-0{margin-left:0}.mr-1{margin-right:.25rem}.ml-7{margin-left:1.75rem}.-mr-1{margin-right:-.25rem}.-mt-5{margin-top:-1.25rem}.mb-0{margin-bottom:0}.-mr-5{margin-right:-1.25rem}.ml-8{margin-left:2rem}.-mt-2{margin-top:-.5rem}.-mr-2{margin-right:-.5rem}.mr-0{margin-right:0}.mb-3{margin-bottom:.75rem}.ml-px{margin-left:1px}.mt-24{margin-top:6rem}.ml-auto{margin-left:auto}.-mt-0\.5{margin-top:-.125rem}.-mt-0{margin-top:0}.box-border{box-sizing:border-box}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0{height:0}.h-11{height:2.75rem}.h-20{height:5rem}.h-3{height:.75rem}.h-full{height:100%}.h-2{height:.5rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-5{height:1.25rem}.h-4{height:1rem}.h-48{height:12rem}.h-8{height:2rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-px{height:1px}.h-screen{height:100vh}.h-15{height:3.75rem}.h-21{height:5.25rem}.h-32{height:8rem}.h-1{height:.25rem}.h-4\.5{height:1.125rem}.h-13{height:3.25rem}.h-1\.5{height:.375rem}.h-28{height:7rem}.h-40{height:10rem}.h-auto{height:auto}.h-36{height:9rem}.max-h-80{max-height:20rem}.max-h-48{max-height:12rem}.max-h-full{max-height:100%}.w-full{width:100%}.w-60{width:15rem}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/2{width:50%}.w-0{width:0}.w-20{width:5rem}.w-32{width:8rem}.w-12{width:3rem}.w-2{width:.5rem}.w-11{width:2.75rem}.w-56{width:14rem}.w-1\/4{width:25%}.w-24{width:6rem}.w-64{width:16rem}.w-4{width:1rem}.w-48{width:12rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-8{width:2rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-14{width:3.5rem}.w-screen{width:100vw}.w-96{width:24rem}.w-40{width:10rem}.w-3{width:.75rem}.w-15{width:3.75rem}.w-3\/4{width:75%}.w-5\/6{width:83.333333%}.w-1{width:.25rem}.w-4\.5{width:1.125rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-auto{width:auto}.w-21{width:5.25rem}.w-px{width:1px}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.min-w-63{min-width:15.75rem}.max-w-lg{max-width:32rem}.max-w-full{max-width:100%}.max-w-2xl{max-width:42rem}.max-w-xl{max-width:36rem}.max-w-md{max-width:28rem}.max-w-5xl{max-width:64rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-134{max-width:33.5rem}.max-w-7xl{max-width:80rem}.max-w-doc{max-width:51.25rem}.max-w-error-image{max-width:697px}.max-w-6xl{max-width:72rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.origin-top-right{transform-origin:top right}.origin-top{transform-origin:top}.origin-bottom-right{transform-origin:bottom right}.translate-x-full{--tw-translate-x:100%}.translate-x-0,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.translate-x-4{--tw-translate-x:1rem}.rotate-180,.translate-x-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-95,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-flow-row{grid-auto-flow:row}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-5{gap:1.25rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-4{row-gap:1rem}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(4rem*var(--tw-space-y-reverse));margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)))}.space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.divide-theme-secondary-200>:not([hidden])~:not([hidden]){border-color:var(--theme-color-secondary-200)}.divide-theme-secondary-300>:not([hidden])~:not([hidden]){border-color:var(--theme-color-secondary-300)}.divide-theme-secondary-800>:not([hidden])~:not([hidden]){border-color:var(--theme-color-secondary-800)}.divide-theme-primary-100>:not([hidden])~:not([hidden]){border-color:var(--theme-color-primary-100)}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded-xl{border-radius:.75rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-2xl{border-radius:1rem}.rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-b-lg{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.border{border-width:1px}.border-2{border-width:2px}.border-3{border-width:3px}.border-6{border-width:6px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-l-2{border-left-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-none{border-style:none}.border-theme-secondary-300{border-color:var(--theme-color-secondary-300)}.border-theme-primary-100{border-color:var(--theme-color-primary-100)}.border-theme-primary-500{border-color:var(--theme-color-primary-500)}.border-theme-secondary-200{border-color:var(--theme-color-secondary-200)}.border-transparent{border-color:transparent}.border-theme-secondary-500{border-color:var(--theme-color-secondary-500)}.border-theme-warning-500{border-color:var(--theme-color-warning-500)}.border-theme-secondary-800{border-color:var(--theme-color-secondary-800)}.border-theme-secondary-900{border-color:var(--theme-color-secondary-900)}.border-theme-primary-700{border-color:var(--theme-color-primary-700)}.border-theme-danger-400{border-color:var(--theme-color-danger-400)}.border-theme-secondary-600{border-color:var(--theme-color-secondary-600)}.border-theme-primary-600{border-color:var(--theme-color-primary-600)}.border-theme-danger-500{border-color:var(--theme-color-danger-500)}.border-theme-secondary-400{border-color:var(--theme-color-secondary-400)}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-theme-danger-100{border-color:var(--theme-color-danger-100)}.border-theme-secondary-700{border-color:var(--theme-color-secondary-700)}.border-theme-primary-200{border-color:var(--theme-color-primary-200)}.bg-theme-primary-100{background-color:var(--theme-color-primary-100)}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-theme-secondary-200{background-color:var(--theme-color-secondary-200)}.bg-theme-primary-50{background-color:var(--theme-color-primary-50)}.bg-theme-secondary-300{background-color:var(--theme-color-secondary-300)}.bg-theme-primary-600{background-color:var(--theme-color-primary-600)}.bg-theme-primary-500{background-color:var(--theme-color-primary-500)}.bg-theme-secondary-100{background-color:var(--theme-color-secondary-100)}.bg-theme-secondary-900{background-color:var(--theme-color-secondary-900)}.bg-transparent{background-color:transparent}.bg-theme-secondary-800{background-color:var(--theme-color-secondary-800)}.bg-theme-danger-400{background-color:var(--theme-color-danger-400)}.bg-theme-danger-50{background-color:var(--theme-color-danger-50)}.bg-theme-success-50{background-color:var(--theme-color-success-50)}.bg-theme-warning-50{background-color:var(--theme-color-warning-50)}.bg-theme-success-200{background-color:var(--theme-color-success-200)}.bg-theme-danger-100{background-color:var(--theme-color-danger-100)}.bg-theme-warning-100{background-color:var(--theme-color-warning-100)}.bg-theme-success-600{background-color:var(--theme-color-success-600)}.bg-theme-danger-200{background-color:var(--theme-color-danger-200)}.bg-theme-secondary-700{background-color:var(--theme-color-secondary-700)}.bg-theme-blog-background{background-color:var(--theme-color-blog-background)}.bg-theme-danger-500{background-color:var(--theme-color-danger-500)}.bg-theme-primary-700{background-color:var(--theme-color-primary-700)}.bg-opacity-90{--tw-bg-opacity:.9}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.bg-contain{background-size:contain}.bg-cover{background-size:cover}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-4{padding:1rem}.p-2{padding:.5rem}.p-0{padding:0}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-3{padding:.75rem}.p-1\.5{padding:.375rem}.p-1{padding:.25rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.p-px{padding:1px}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-12{padding-bottom:3rem;padding-top:3rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.pt-12{padding-top:3rem}.pb-8{padding-bottom:2rem}.pt-10{padding-top:2.5rem}.pb-10{padding-bottom:2.5rem}.pb-6{padding-bottom:1.5rem}.pr-10{padding-right:2.5rem}.pl-7{padding-left:1.75rem}.pr-2{padding-right:.5rem}.pl-2{padding-left:.5rem}.pr-4{padding-right:1rem}.pl-3{padding-left:.75rem}.pb-1{padding-bottom:.25rem}.pr-3{padding-right:.75rem}.pb-4{padding-bottom:1rem}.pb-3{padding-bottom:.75rem}.pb-2{padding-bottom:.5rem}.pr-6{padding-right:1.5rem}.pl-8{padding-left:2rem}.pt-5{padding-top:1.25rem}.pt-2{padding-top:.5rem}.pr-0{padding-right:0}.pl-5{padding-left:1.25rem}.pl-4{padding-left:1rem}.pr-7{padding-right:1.75rem}.pr-8{padding-right:2rem}.pl-6{padding-left:1.5rem}.pt-px{padding-top:1px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.text-sm{font-size:.875rem;line-height:1.25rem}.text-lg{font-size:1.125rem}.text-lg,.text-xl{line-height:1.75rem}.text-xl{font-size:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-base{font-size:1rem;line-height:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-black{font-weight:900}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-relaxed{line-height:1.625}.leading-6{line-height:1.5rem}.leading-8{line-height:2rem}.leading-7{line-height:1.75rem}.leading-tight{line-height:1.25}.leading-loose{line-height:2}.leading-none{line-height:1}.leading-normal{line-height:1.5}.tracking-wider{letter-spacing:.05em}.text-theme-secondary-800{color:var(--theme-color-secondary-800)}.text-theme-success-600{color:var(--theme-color-success-600)}.text-theme-primary-500{color:var(--theme-color-primary-500)}.text-theme-secondary-900{color:var(--theme-color-secondary-900)}.text-theme-secondary-500{color:var(--theme-color-secondary-500)}.text-theme-secondary-700{color:var(--theme-color-secondary-700)}.text-theme-secondary-600{color:var(--theme-color-secondary-600)}.text-theme-warning-600{color:var(--theme-color-warning-600)}.text-theme-primary-600{color:var(--theme-color-primary-600)}.text-theme-danger-600{color:var(--theme-color-danger-600)}.text-theme-danger-400{color:var(--theme-color-danger-400)}.text-theme-secondary-400{color:var(--theme-color-secondary-400)}.text-theme-primary-300{color:var(--theme-color-primary-300)}.text-theme-secondary-300{color:var(--theme-color-secondary-300)}.text-theme-secondary-200{color:var(--theme-color-secondary-200)}.text-transparent{color:transparent}.text-theme-success-500{color:var(--theme-color-success-500)}.text-theme-danger-500{color:var(--theme-color-danger-500)}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-theme-secondary-100{color:var(--theme-color-secondary-100)}.text-theme-warning-900{color:var(--theme-color-warning-900)}.text-theme-warning-200{color:var(--theme-color-warning-200)}.text-theme-primary-100{color:var(--theme-color-primary-100)}.text-theme-info-300{color:var(--theme-color-info-300)}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.no-underline{-webkit-text-decoration-line:none;text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-40{opacity:.4}.opacity-75{opacity:.75}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-90{opacity:.9}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-2xl,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-navbar-dropdown{--tw-shadow:0px 15px 35px 0 rgba(33,34,37,.08);--tw-shadow-colored:0px 15px 35px 0 var(--tw-shadow-color)}.shadow-navbar-dropdown,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-0{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-focus{--tw-ring-color:rgba(var(--theme-color-primary-rgb),0.50)}.blur{--tw-blur:blur(8px)}.blur,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-xl,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-75{transition-duration:75ms}.duration-1000{transition-duration:1s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.transition-default{transition:all .1s ease-in}.fill-current{fill:currentColor}@font-face{font-family:swiper-icons;font-style:normal;font-weight:400;src:url("data:application/font-woff;charset=utf-8;base64, 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")}:root{--swiper-theme-color:#007aff}.swiper{list-style:none;margin-left:auto;margin-right:auto;overflow:hidden;padding:0;position:relative;z-index:1}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{box-sizing:content-box;display:flex;height:100%;position:relative;transition-property:transform;width:100%;z-index:1}.swiper-android .swiper-slide,.swiper-wrapper{transform:translateZ(0)}.swiper-pointer-events{touch-action:pan-y}.swiper-pointer-events.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;height:100%;position:relative;transition-property:transform;width:100%}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0)}.swiper-3d,.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide,.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top,.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(270deg,rgba(0,0,0,.5),transparent)}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(90deg,rgba(0,0,0,.5),transparent)}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(0deg,rgba(0,0,0,.5),transparent)}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(180deg,rgba(0,0,0,.5),transparent)}.swiper-css-mode>.swiper-wrapper{-ms-overflow-style:none;overflow:auto;scrollbar-width:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-horizontal.swiper-css-mode>.swiper-wrapper{-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.swiper-vertical.swiper-css-mode>.swiper-wrapper{-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.swiper-centered>.swiper-wrapper:before{content:"";flex-shrink:0;order:9999}.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{-webkit-margin-start:var(--swiper-centered-offset-before);margin-inline-start:var(--swiper-centered-offset-before)}.swiper-centered.swiper-horizontal>.swiper-wrapper:before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{-webkit-margin-before:var(--swiper-centered-offset-before);margin-block-start:var(--swiper-centered-offset-before)}.swiper-centered.swiper-vertical>.swiper-wrapper:before{height:var(--swiper-centered-offset-after);min-width:1px;width:100%}.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center}.swiper-virtual .swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode .swiper-wrapper:after{content:"";left:0;pointer-events:none;position:absolute;top:0}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper:after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper:after{height:var(--swiper-virtual-size);width:1px}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{align-items:center;color:var(--swiper-navigation-color,var(--swiper-theme-color));cursor:pointer;display:flex;height:var(--swiper-navigation-size);justify-content:center;margin-top:calc(0px - var(--swiper-navigation-size)/2);position:absolute;top:50%;width:calc(var(--swiper-navigation-size)/44*27);z-index:10}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{cursor:auto;opacity:.35;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{cursor:auto;opacity:0;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);font-variant:normal;letter-spacing:0;line-height:1;text-transform:none!important}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:10px;right:auto}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:"prev"}.swiper-button-next,.swiper-rtl .swiper-button-prev{left:auto;right:10px}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:"next"}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;transform:translateZ(0);transition:opacity .3s;z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullets-dynamic{font-size:0;overflow:hidden}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{position:relative;transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active,.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{background:var(--swiper-pagination-bullet-inactive-color,#000);border-radius:50%;display:inline-block;height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));opacity:var(--swiper-pagination-bullet-inactive-opacity,.2);width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px))}button.swiper-pagination-bullet{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;margin:0;padding:0}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{background:var(--swiper-pagination-color,var(--swiper-theme-color));opacity:var(--swiper-pagination-bullet-opacity,1)}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:10px;top:50%;transform:translate3d(0,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{display:block;margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:transform .2s,top .2s}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,left .2s}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,right .2s}.swiper-pagination-progressbar{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));height:100%;left:0;position:absolute;top:0;transform:scale(0);transform-origin:left top;width:100%}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{height:4px;left:0;top:0;width:100%}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{height:100%;left:0;top:0;width:4px}.swiper-pagination-lock{display:none}.swiper-scrollbar{background:rgba(0,0,0,.1);border-radius:10px;position:relative;-ms-touch-action:none}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{bottom:3px;height:5px;left:1%;position:absolute;width:98%;z-index:50}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{height:98%;position:absolute;right:3px;top:1%;width:5px;z-index:50}.swiper-scrollbar-drag{background:rgba(0,0,0,.5);border-radius:10px;height:100%;left:0;position:relative;top:0;width:100%}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{align-items:center;display:flex;height:100%;justify-content:center;text-align:center;width:100%}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.swiper-slide-zoomed{cursor:move}.swiper-lazy-preloader{border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top:4px solid transparent;box-sizing:border-box;height:42px;left:50%;margin-left:-21px;margin-top:-21px;position:absolute;top:50%;transform-origin:50%;width:42px;z-index:10}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{-webkit-animation:swiper-preloader-spin 1s linear infinite;animation:swiper-preloader-spin 1s linear infinite}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@-webkit-keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.swiper .swiper-notification{left:0;opacity:0;pointer-events:none;position:absolute;top:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{margin:0 auto;transition-timing-function:ease-out}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-direction:column;flex-wrap:wrap}.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active,.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;height:100%;pointer-events:none;transform-origin:0 0;visibility:hidden;width:100%;z-index:1}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-next+.swiper-slide,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-top{-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:0}.swiper-cube .swiper-cube-shadow{bottom:0;height:100%;left:0;opacity:.6;position:absolute;width:100%;z-index:0}.swiper-cube .swiper-cube-shadow:before{background:#000;bottom:0;content:"";filter:blur(50px);left:0;position:absolute;right:0;top:0}.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:none;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-top{-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:0}.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transform-origin:center bottom}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#e2e8f0;border-radius:.25rem;border-width:1px;font-size:1rem;line-height:1.5;padding:.5rem .75rem}.form-input::-moz-placeholder{color:#a0aec0;opacity:1}.form-input:-ms-input-placeholder{color:#a0aec0;opacity:1}.form-input::placeholder{color:#a0aec0;opacity:1}.form-select{-webkit-print-color-adjust:exact;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23a0aec0'%3E%3Cpath d='M15.3 9.3a1 1 0 0 1 1.4 1.4l-4 4a1 1 0 0 1-1.4 0l-4-4a1 1 0 0 1 1.4-1.4l3.3 3.29 3.3-3.3z'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;border-color:#e2e8f0;border-radius:.25rem;border-width:1px;color-adjust:exact;font-size:1rem;line-height:1.5;padding:.5rem 2.5rem .5rem .75rem}.form-select::-ms-expand{border:none;color:#a0aec0}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-checkbox{-webkit-print-color-adjust:exact;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#e2e8f0;border-radius:.25rem;border-width:1px;color:#4299e1;color-adjust:exact;display:inline-block;flex-shrink:0;height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:1em}.form-checkbox:checked{background-color:currentColor;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}@media not print{.form-checkbox::-ms-check{background:inherit;border-color:inherit;border-radius:inherit;border-width:1px;color:transparent}}.form-radio{-webkit-print-color-adjust:exact;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#e2e8f0;border-radius:100%;border-width:1px;color:#4299e1;color-adjust:exact;display:inline-block;flex-shrink:0;height:1em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:1em}.form-radio:checked{background-color:currentColor;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}@media not print{.form-radio::-ms-check{background:inherit;border-color:inherit;border-radius:inherit;border-width:1px;color:transparent}}.animation-spin{-webkit-animation-duration:2s;-moz-animation-duration:2s;-ms-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin;-moz-animation-name:spin;-ms-animation-name:spin;animation-name:spin;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes wobble{0%{transform:translateZ(0)}15%{transform:translate3d(-25%,0,0) rotate(-5deg)}30%{transform:translate3d(20%,0,0) rotate(3deg)}45%{transform:translate3d(-15%,0,0) rotate(-3deg)}60%{transform:translate3d(10%,0,0) rotate(2deg)}75%{transform:translate3d(-5%,0,0) rotate(-1deg)}to{transform:translateZ(0)}}@keyframes wobble{0%{transform:translateZ(0)}15%{transform:translate3d(-25%,0,0) rotate(-5deg)}30%{transform:translate3d(20%,0,0) rotate(3deg)}45%{transform:translate3d(-15%,0,0) rotate(-3deg)}60%{transform:translate3d(10%,0,0) rotate(2deg)}75%{transform:translate3d(-5%,0,0) rotate(-1deg)}to{transform:translateZ(0)}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.dropdown-button-outline{background-color:transparent;border:1px solid var(--theme-color-secondary-200);border-radius:.25rem}.dropdown-entry,.rich-select-dropdown-entry{cursor:pointer;display:block;font-weight:500;padding:1rem 2rem;text-align:left;transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap;width:100%}.table-container table>tbody>tr>td.hoverable-cell:is(.dropdown-entry)>div.table-cell-content,.table-container table>tbody>tr>td.hoverable-cell:is(.rich-select-dropdown-entry)>div.table-cell-content{justify-content:flex-start}.dropdown-entry,.rich-select-dropdown-entry:not(.rich-select-dropdown-entry-selected):not(.rich-select-dropdown-entry-hover){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:var(--theme-color-secondary-900)}.dark .dropdown-entry,.dark +.rich-select-dropdown-entry:not(.rich-select-dropdown-entry-selected):not(.rich-select-dropdown-entry-hover){background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-200)}.dropdown-entry:focus{outline:2px solid transparent;outline-offset:2px}.dropdown-entry:not([disabled]):not(.dropdown-entry-disabled):hover,.rich-select-dropdown-entry-hover{background-color:var(--theme-color-secondary-100);color:var(--theme-color-secondary-900)}.dark .dropdown-entry:not([disabled]):not(.dropdown-entry-disabled):hover,.dark +.rich-select-dropdown-entry-hover{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-200)}.dropdown-entry-disabled,.dropdown-entry[disabled]{cursor:not-allowed;opacity:.5}.dropdown-entry-selected,.rich-select-dropdown-entry-selected{color:var(--theme-color-primary-600);position:relative}.dark .dropdown-entry-selected,.dark +.rich-select-dropdown-entry-selected{--tw-bg-opacity:1;background-color:rgb(18 18 19/var(--tw-bg-opacity));color:var(--theme-color-primary-600)}.dropdown-entry-selected:before,.rich-select-dropdown-entry-selected:before{background-color:var(--theme-color-primary-600);content:"";height:100%;left:0;position:absolute;top:0;width:.25rem}.dropdown-entry-selected,.rich-select-dropdown-entry-selected{background-color:var(--theme-color-primary-50)}.custom-scroll::-webkit-scrollbar{border-radius:.5rem;height:4px;width:6px}.custom-scroll::-webkit-scrollbar-track-piece:start{background:transparent}.custom-scroll::-webkit-scrollbar-thumb{background-color:var(--theme-color-primary-200);border-radius:.5rem}.custom-scroll{scrollbar-color:#bad6f0 transparent}.documentation-sidebar .tabs+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.tabs{background-color:var(--theme-color-secondary-100);border-radius:.75rem;display:flex;font-weight:600}.dark .tabs{--tw-bg-opacity:1;background-color:rgb(18 18 19/var(--tw-bg-opacity))}.tab-item{border-bottom-width:3px;border-color:transparent;color:var(--theme-color-secondary-700);font-weight:600;margin-left:1.5rem;margin-right:1.5rem;padding-bottom:.75rem;padding-top:1rem;position:relative;transition:all .1s ease-in;white-space:nowrap}.tab-item-current,.tab-item:hover:not(:disabled){border-color:var(--theme-color-primary-600);color:var(--theme-color-secondary-900)}.tab-item:disabled{color:var(--theme-color-secondary-500)}.dark .tab-item-current,.dark .tab-item:hover:not(:disabled){color:var(--theme-color-secondary-200)}.tab-item:before{border-color:var(--theme-color-secondary-300);border-left-width:1px;content:"";height:1.5rem;left:0;margin-left:-1.5rem;position:absolute}.tabs>li[role=presentation]:first-child>.tab-item:before{border-left-width:0}.dark .tab-item:before{border-color:var(--theme-color-secondary-800)}.documentation-sidebar .tabs-wrapper+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.tabs-wrapper{align-items:center;display:flex;flex-direction:column;width:100%}[role=tablist]{padding-left:.5rem;padding-right:.5rem}[role=tabpanel]{width:100%}.info-badge{background-color:var(--theme-color-primary-100);border-radius:.75rem;font-size:.875rem;line-height:1.25rem;margin-left:.25rem;padding:2px 6px}.dark .info-badge{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-700)}.link{color:var(--theme-color-primary-600);cursor:pointer;-webkit-text-decoration-line:none;text-decoration-line:none;transition:all .1s ease-in}.simple-markdown a:is(.link):hover{text-decoration:none}.link.read-only{cursor:not-allowed}.link:hover{color:var(--theme-color-primary-700);-webkit-text-decoration-line:underline;text-decoration-line:underline}.link.link-no-underline:hover{-webkit-text-decoration-line:none;text-decoration-line:none}.simple-markdown a:is(.link.link-no-underline:hover):hover{text-decoration:none}.link:active{color:var(--theme-color-primary-400)}.avatar-wrapper .avatar-circle{background-color:var(--theme-color-primary-100)}.avatar-wrapper:hover .avatar-circle{background-color:var(--theme-color-primary-200)}.documentation-sidebar .pagination-wrapper+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.pagination-wrapper{display:flex;flex-direction:column}.pagination-wrapper input::-webkit-inner-spin-button,.pagination-wrapper input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.pagination-wrapper input[type=number]{-moz-appearance:textfield}.documentation-sidebar .pagination-pages-mobile+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.pagination-pages-mobile{background-color:var(--theme-color-primary-100);border-radius:.25rem;display:flex;justify-content:center;margin-bottom:.75rem;padding-left:.5rem;padding-right:.5rem}.documentation-sidebar .pagination-button-mobile+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.pagination-button-mobile{display:flex;flex:1 1 0%;justify-content:center}.pagination-pages{background-color:var(--theme-color-primary-100);border-radius:.25rem;display:none;padding-left:.5rem;padding-right:.5rem}.dark .pagination-pages,.dark .pagination-pages-mobile{background-color:var(--theme-color-secondary-800)}@media screen and (min-width:450px){.pagination-wrapper{display:block}.pagination-pages-mobile{display:none}.pagination-button-mobile{flex:0 1 auto}.documentation-sidebar .pagination-pages+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.pagination-pages{display:flex}}@media screen and (max-width:451px){.pagination-form-desktop{display:none}}.modal-content,.modal-content-square{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));position:relative}@media screen and (max-width:767px){.modal-content,.modal-content-wrapper{max-width:100%!important}}@media (min-width:768px){.modal-content{border-radius:1.25rem}.modal-content,.modal-content-square{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);margin-left:auto;margin-right:auto}}.dark .modal-content,.dark .modal-content-square{background-color:var(--theme-color-secondary-900)}.modal-close{background-color:var(--theme-color-info-100);border-radius:.25rem;color:var(--theme-color-secondary-900);height:2.75rem;margin-right:1.25rem;margin-top:1.25rem;position:absolute;right:0;top:0;transition:all .1s ease-in;width:3rem;z-index:50}.dark .modal-close{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-600)}.modal-close:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);background-color:var(--theme-color-info-300);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dark .modal-close:hover{background-color:var(--theme-color-secondary-700);color:var(--theme-color-secondary-400)}@media (min-width:1024px){.modal-content,.modal-content-square{width:100%}}.documentation-sidebar .modal-buttons+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.modal-buttons{display:flex;flex-direction:column-reverse;justify-content:flex-end}.modal-buttons>:not(:first-child){margin-bottom:.75rem}@media (min-width:640px){.modal-buttons{flex-direction:row}.modal-buttons>:not(:first-child){margin-bottom:0;margin-left:.75rem}}.documentation-sidebar .description-block+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.description-block{border-color:var(--theme-color-secondary-200);border-radius:.75rem;border-width:2px;display:flex;flex-direction:column;padding:2.5rem;transition:all .1s ease-in}.description-block-link:hover{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;transform:scale(1.02)}.description-block-link:hover .link{color:var(--theme-color-primary-700);-webkit-text-decoration-line:underline;text-decoration-line:underline}.documentation-sidebar .navbar-mobile-link+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.navbar-mobile-link{--tw-border-opacity:1;align-items:center;border-color:rgb(255 255 255/var(--tw-border-opacity));border-left-width:3px;display:block;display:flex;font-weight:600;padding-bottom:.75rem;padding-left:2rem;padding-top:.75rem;width:100%}.dark .navbar-mobile-link{border-color:var(--theme-color-secondary-900)}.navbar-mobile-link-current{background-color:var(--theme-color-primary-100);border-color:var(--theme-color-primary-600)}.dark .navbar-mobile-link-current{background-color:var(--theme-color-secondary-800);border-color:var(--theme-color-primary-600);color:var(--theme-color-secondary-200)}.navbar-mobile-link:not(.navbar-mobile-link-current){color:var(--theme-color-secondary-900)}.navbar-mobile-link:not(.navbar-mobile-link-current):hover{color:var(--theme-color-primary-600)}.dark .navbar-mobile-link:not(.navbar-mobile-link-current){color:var(--theme-color-secondary-200)}.documentation-sidebar .circled-icon+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.circled-icon{align-items:center;border-radius:9999px;border-width:2px;display:flex;height:2.75rem;justify-content:center;width:2.75rem}.tile-selection-list{display:grid;gap:1.25rem;grid-template-columns:repeat(2,minmax(0,1fr))}.swiper-wrapper.tile-selection-list .swiper-slide:nth-child(n+2){display:none}@media (min-width:640px){.swiper-wrapper.grid.tile-selection-list .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.sm\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.sm\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.sm\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.sm\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid.tile-selection-list .swiper-slide:nth-child(n+5),.swiper-wrapper.tile-selection-list.sm\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list.sm\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list.sm\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list.sm\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:768px){.swiper-wrapper.tile-selection-list.md\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.md\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.md\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.md\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-selection-list.md\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list.md\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list.md\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list.md\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1024px){.swiper-wrapper.tile-selection-list.lg\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.lg\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.lg\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.lg\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-selection-list.lg\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list.lg\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list.lg\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list.lg\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1280px){.swiper-wrapper.tile-selection-list.xl\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.xl\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.xl\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list.xl\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-selection-list.xl\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list.xl\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list.xl\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list.xl\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:640px){.tile-selection-list{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1024px){.tile-selection-list{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:1280px){.tile-selection-list{grid-template-columns:repeat(8,minmax(0,1fr))}}.tile-selection-list-single{display:grid;gap:1.25rem;grid-template-columns:repeat(2,minmax(0,1fr))}.swiper-wrapper.tile-selection-list-single .swiper-slide:nth-child(n+2){display:none}@media (min-width:640px){.swiper-wrapper.grid.tile-selection-list-single .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid.tile-selection-list-single .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list-single.sm\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:768px){.swiper-wrapper.tile-selection-list-single.md\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.md\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.md\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.md\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-selection-list-single.md\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list-single.md\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list-single.md\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list-single.md\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1024px){.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list-single.lg\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1280px){.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-selection-list-single.xl\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:640px){.tile-selection-list-single{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.tile-selection-list-single{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width:1280px){.tile-selection-list-single{grid-template-columns:repeat(6,minmax(0,1fr))}}.tile-selection-option{border-color:var(--theme-color-primary-100);border-radius:.75rem;border-width:2px;cursor:pointer;height:7.5rem;position:relative;transition:all .1s ease-in;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dark .tile-selection-option{border-color:var(--theme-color-secondary-800)}.tile-selection-single{border-color:var(--theme-color-primary-100);border-radius:.75rem;border-width:2px;cursor:pointer;outline:2px solid transparent;outline-offset:2px;padding-bottom:1rem;padding-top:1rem;position:relative;transition:all .1s ease-in;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tile-selection-single:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:var(--theme-color-primary-500);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.dark .tile-selection-single{border-color:var(--theme-color-secondary-800)}.tile-selection-option:hover,.tile-selection-single:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-700)}.tile-selection-option:not(.tile-selection--checked):hover,.tile-selection-single:not(.tile-selection--checked):hover{border-color:transparent}.dark .tile-selection-option:not(.tile-selection--checked):hover,.dark +.tile-selection-single:not(.tile-selection--checked):hover{border-color:var(--theme-color-success-400)}.documentation-sidebar .tile-selection-select-all+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.tile-selection-select-all{align-items:center;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width:768px){.tile-selection-select-all{flex-direction:row-reverse}}.tile-selection-checkbox,.tile-selection-checkbox:focus,.tile-selection-select-all-checkbox,.tile-selection-select-all-checkbox:focus{border-color:var(--theme-color-primary-100);border-radius:.25rem;border-width:2px}.dark .tile-selection-checkbox,.dark +.tile-selection-checkbox:focus,.dark +.tile-selection-select-all-checkbox,.dark +.tile-selection-select-all-checkbox:focus{background-color:transparent;border-color:var(--theme-color-secondary-600)}.dark .group:hover .tile-selection-checkbox,.dark .group:hover +.tile-selection-checkbox:focus,.dark .group:hover +.tile-selection-select-all-checkbox,.dark .group:hover +.tile-selection-select-all-checkbox:focus{border-color:var(--theme-color-success-600)}.tile-selection-select-all-checkbox{margin-right:.5rem}@media (min-width:768px){.tile-selection-select-all-checkbox{margin-left:.5rem;margin-right:0}}.tile-selection-checkbox{cursor:pointer;position:absolute;right:.5rem;top:.5rem}.tile-selection-checkbox,.tile-selection-checkbox:focus{border-color:var(--theme-color-primary-100)}.tile-selection--checked{background-color:var(--theme-color-success-50);border-color:var(--theme-color-success-500)}.dark .tile-selection--checked{background-color:var(--theme-color-success-900);border-color:var(--theme-color-success-600);color:var(--theme-color-secondary-200)}.dark +.tile-selection-checkbox:checked,.dark .tile-selection-select-all-checkbox:checked,.tile-selection-checkbox:checked,.tile-selection-select-all-checkbox:checked{background-color:var(--theme-color-success-600);border-color:var(--theme-color-success-600)}.tile-links-list,.tile-links-list-md{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.swiper-wrapper +.tile-links-list-md .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list .swiper-slide:nth-child(n+2){display:none}@media (min-width:640px){.swiper-wrapper.grid +.tile-links-list-md .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.tile-links-list .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-4 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.sm\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.sm\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.sm\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.sm\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid +.tile-links-list-md .swiper-slide:nth-child(n+4),.swiper-wrapper.grid.tile-links-list .swiper-slide:nth-child(n+4),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper +.tile-links-list-md.sm\:grid-cols-4 .swiper-slide:nth-child(n+5),.swiper-wrapper.tile-links-list.sm\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list.sm\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list.sm\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list.sm\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:768px){.swiper-wrapper.grid +.tile-links-list-md .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.tile-links-list .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-4 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.md\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.md\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.md\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.md\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid +.tile-links-list-md .swiper-slide:nth-child(n+5),.swiper-wrapper.grid.tile-links-list .swiper-slide:nth-child(n+5),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper +.tile-links-list-md.md\:grid-cols-4 .swiper-slide:nth-child(n+5),.swiper-wrapper.tile-links-list.md\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list.md\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list.md\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list.md\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1024px){.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-4 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.lg\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.lg\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.lg\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.lg\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper +.tile-links-list-md.lg\:grid-cols-4 .swiper-slide:nth-child(n+5),.swiper-wrapper.tile-links-list.lg\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list.lg\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list.lg\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list.lg\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1280px){.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-4 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.xl\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.xl\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.xl\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list.xl\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper +.tile-links-list-md.xl\:grid-cols-4 .swiper-slide:nth-child(n+5),.swiper-wrapper.tile-links-list.xl\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list.xl\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list.xl\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list.xl\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:640px){.tile-links-list,.tile-links-list-md{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.tile-links-list,.tile-links-list-md{grid-template-columns:repeat(4,minmax(0,1fr))}}.tile-links-list{gap:1.25rem}@media (min-width:1024px){.tile-links-list{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width:1280px){.tile-links-list{grid-template-columns:repeat(6,minmax(0,1fr))}}.tile-links-list-md{gap:.75rem}.tile-links-list-sm{display:grid;gap:.75rem;grid-template-columns:repeat(3,minmax(0,1fr))}.swiper-wrapper.tile-links-list-sm .swiper-slide:nth-child(n+2){display:none}@media (min-width:640px){.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list-sm.sm\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:768px){.swiper-wrapper.tile-links-list-sm.md\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.md\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.md\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.md\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-links-list-sm.md\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list-sm.md\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list-sm.md\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list-sm.md\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1024px){.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list-sm.lg\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1280px){.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.tile-links-list-sm.xl\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}.tile-link{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.75rem;cursor:pointer;height:7.5rem;position:relative;transition:all .1s ease-in;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dark .tile-link{background-color:var(--theme-color-secondary-900)}.tile-link:not(.tile-link-disabled){cursor:pointer}.tile-link:not(.tile-links-show-more){color:var(--theme-color-secondary-900)}.tile-link:not(.tile-link-disabled):hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);border-color:transparent;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-primary-700)}.documentation-sidebar .tile-link-title-icon+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.tile-link-title-icon{align-items:center;display:flex;flex-direction:column;font-weight:600;height:100%;justify-content:center}.tile-link-sm .tile-link-title-icon{flex-direction:row}.tile-link-icon{transition:all .1s ease-in}.tile-link-icon:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark .tile-link-icon{color:var(--theme-color-secondary-600)}.dark .group:hover .tile-link-icon,.dark .tile-link-title{color:var(--theme-color-secondary-200)}.tile-links-show-more{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.75rem;color:var(--theme-color-primary-600);cursor:pointer;font-weight:600;height:7.5rem;position:relative;text-align:center;transition:all .1s ease-in;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dark .tile-links-show-more{background-color:var(--theme-color-secondary-900)}.tile-links-show-more:not(.tile-link-disabled){cursor:pointer}.tile-links-show-more:not(.tile-links-show-more){color:var(--theme-color-secondary-900)}.tile-links-show-more:not(.tile-link-disabled):hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);border-color:transparent;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-primary-700)}.tile-links-show-more:hover{--tw-text-opacity:1;background-color:var(--theme-color-primary-700);color:rgb(255 255 255/var(--tw-text-opacity))}.tile-link-border{border-color:var(--theme-color-primary-100);border-width:2px}.dark .tile-link-border{border-color:var(--theme-color-secondary-800)}.tile-link-md,.tile-link-sm{font-size:.875rem;height:3rem;line-height:1.25rem}.tile-link-md .tile-link-icon,.tile-link-sm .tile-link-title{display:none}@media (min-width:640px){.tile-link-sm .tile-link-title{display:block}.tile-link-sm .tile-link-icon{display:none}.tile-link-md,.tile-link-sm{font-size:1rem;height:3.25rem;line-height:1.5rem}}@media (min-width:768px){.tile-link-md{height:5.5rem}.tile-link-sm .tile-link-icon{display:block;margin-right:.5rem}.tile-link-md .tile-link-icon{display:block;margin-bottom:.5rem}}.disabled-tile{background-color:transparent;border-color:var(--theme-color-secondary-300);opacity:.5;pointer-events:none}.tile-link-disabled:not(.tile-links-show-more){color:var(--theme-color-secondary-500)}.dark .tile-link-disabled:not(.tile-links-show-more){color:var(--theme-color-secondary-700)}.tile-link-disabled.tile-link-border{border-color:var(--theme-color-secondary-200)}.dark .tile-link-disabled.tile-link-border{border-color:var(--theme-color-secondary-800)}.dark .tile-link-disabled .tile-link-title{color:var(--theme-color-secondary-700)}.dark .tile-link-disabled .tile-link-icon{color:var(--theme-color-secondary-800)}.contact-header{padding-bottom:2rem;padding-top:2rem}.documentation-sidebar .contact-header+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.contact-header{display:flex;margin-left:auto;margin-right:auto;padding-left:2rem;padding-right:2rem}@media (min-width:768px){.contact-header{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.contact-header{max-width:80rem}}.contact-content{padding-bottom:2rem;padding-top:2rem}.documentation-sidebar .contact-content+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.contact-content{display:flex;margin-left:auto;margin-right:auto;padding-left:2rem;padding-right:2rem}@media (min-width:768px){.contact-content{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.contact-content{max-width:80rem}}.accordion{margin-left:-2rem;margin-right:-2rem}.documentation-sidebar .accordion-trigger+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.accordion-trigger{align-items:center;border-radius:.25rem;display:flex;justify-content:space-between;text-align:left;width:100%}.table-container table>tbody>tr>td.hoverable-cell:is(.accordion-trigger)>div.table-cell-content{justify-content:flex-start}@media (min-width:768px){.accordion{margin-left:0;margin-right:0}.accordion+.accordion{margin-top:1rem}}.notification-dot{border-radius:9999px;display:block;position:absolute}.sidebar-group{padding-left:2rem;padding-right:2rem}@media (min-width:1024px){.sidebar-group{margin-left:1.5rem;padding-left:0;padding-right:0}}.sidebar-link+.sidebar-group>button{border-top-width:0}.documentation-sidebar .sidebar-link+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.sidebar-link{align-items:center;display:flex}.sidebar-link:last-child .sidebar-link-divider{display:none}.documentation-sidebar .twitter-embed-wrapper+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.twitter-embed-wrapper{align-items:center;display:flex;flex-direction:column}.dark .twitter-embed-wrapper,.twitter-embed-wrapper.twitter-embed-wrapper-dark{display:none}.dark .twitter-embed-wrapper.twitter-embed-wrapper-dark{display:flex}.documentation-sidebar .dark .twitter-embed-wrapper.twitter-embed-wrapper-dark+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}html{font-family:Inter,sans-serif}@supports (font-variation-settings:normal){html{font-family:Inter var,sans-serif}}.semibold{font-family:Inter Semibold}@font-face{font-display:swap;font-family:FiraMono;font-weight:400;src:url(../fonts/FiraMono-Regular.otf)}@font-face{font-display:swap;font-family:FiraMono;font-style:italic;font-weight:400;src:url(../fonts/FiraMono-RegularItalic.otf)}@font-face{font-display:swap;font-family:FiraMono;font-weight:700;src:url(../fonts/FiraMono-Bold.otf)}input[type=password]::-ms-reveal{display:none}.documentation-sidebar .input-label+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.input-label{color:var(--theme-color-secondary-700);display:flex;font-size:.875rem;font-weight:600;line-height:1.25rem;transition:all .1s ease-in}.dark .input-label{color:var(--theme-color-secondary-500)}.input-label--toggle{color:var(--theme-color-secondary-700);font-size:1rem;font-weight:600;line-height:1.25rem;margin-right:.75rem;transition:all .1s ease-in}.input-wrapper{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.25rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-900);margin-top:.5rem;position:relative}.dark .input-wrapper{color:var(--theme-color-secondary-200)}.documentation-sidebar .input-tooltip+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.input-tooltip{--tw-text-opacity:1;align-items:center;background-color:var(--theme-color-secondary-700);border-radius:9999px;color:rgb(255 255 255/var(--tw-text-opacity));display:flex;font-size:.875rem;height:1rem;justify-content:center;line-height:1.25rem;margin-left:.5rem;width:1rem}.input-text{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#e2e8f0;border-radius:.25rem;border-width:1px;display:block;font-size:1rem;line-height:1.5;margin-right:1.5rem;padding:.5rem .75rem;transition:all .1s ease-in;width:100%}.input-text::-moz-placeholder{color:#a0aec0;opacity:1}.input-text:-ms-input-placeholder{color:#a0aec0;opacity:1}.input-text::placeholder{color:#a0aec0;opacity:1}.input-rich-select .input-text{padding:.75rem 1rem}.input-text{padding:.75rem 1rem}.dark :not(.light).input-text{background-color:var(--theme-color-secondary-900);border-color:var(--theme-color-secondary-700)}.input-text.shifted{padding:.75rem 3.25rem .75rem .75rem}.dark .input-text-with-prefix::-moz-placeholder,.dark .input-text-with-suffix::-moz-placeholder,.dark .input-text::-moz-placeholder{color:var(--theme-color-secondary-700)}.dark .input-text-with-prefix:-ms-input-placeholder,.dark .input-text-with-suffix:-ms-input-placeholder,.dark .input-text:-ms-input-placeholder{color:var(--theme-color-secondary-700)}.dark .input-text-with-prefix::placeholder,.dark .input-text-with-suffix::placeholder,.dark .input-text::placeholder{color:var(--theme-color-secondary-700)}.input-rich-select .form-input{padding:.75rem 1rem}.input-group:focus-within .input-label,.input-group:hover .input-label{color:var(--theme-color-primary-600)}.input-group:focus-within .form-select,.input-group:focus-within .input-text,.input-group:focus-within .input-wrapper-with-prefix,.input-group:focus-within .input-wrapper-with-suffix{border-color:var(--theme-color-primary-600)}.input-group:focus-within .input-text-with-icon:-moz-read-only,.input-group:focus-within .input-text-with-prefix:-moz-read-only,.input-group:focus-within .input-text-with-suffix:-moz-read-only,.input-group:focus-within .input-text:-moz-read-only,.input-text-with-icon:-moz-read-only,.input-text-with-prefix:-moz-read-only,.input-text-with-suffix:-moz-read-only,.input-text:-moz-read-only{background-color:var(--theme-color-secondary-100);border-color:var(--theme-color-secondary-400);cursor:not-allowed}.input-group:focus-within .input-text-with-icon:read-only,.input-group:focus-within .input-text-with-prefix:read-only,.input-group:focus-within .input-text-with-suffix:read-only,.input-group:focus-within .input-text:read-only,.input-text-with-icon:read-only,.input-text-with-prefix:read-only,.input-text-with-suffix:read-only,.input-text:read-only{background-color:var(--theme-color-secondary-100);border-color:var(--theme-color-secondary-400);cursor:not-allowed}.dark +.input-group:focus-within .input-text-with-icon:-moz-read-only,.dark .input-group:focus-within .input-text-with-prefix:-moz-read-only,.dark +.input-group:focus-within .input-text-with-suffix:-moz-read-only,.dark +.input-group:focus-within .input-text:-moz-read-only,.dark +.input-text-with-icon:-moz-read-only,.dark +.input-text-with-prefix:-moz-read-only,.dark +.input-text-with-suffix:-moz-read-only,.dark +.input-text:-moz-read-only{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-500)}.dark +.input-group:focus-within .input-text-with-icon:read-only,.dark .input-group:focus-within .input-text-with-prefix:read-only,.dark +.input-group:focus-within .input-text-with-suffix:read-only,.dark +.input-group:focus-within .input-text:read-only,.dark +.input-text-with-icon:read-only,.dark +.input-text-with-prefix:read-only,.dark +.input-text-with-suffix:read-only,.dark +.input-text:read-only{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-500)}.input-group:focus-within .input-text-with-icon.cursor-default:-moz-read-only,.input-group:focus-within .input-text-with-prefix.cursor-default:-moz-read-only,.input-group:focus-within .input-text-with-suffix.cursor-default:-moz-read-only,.input-group:focus-within .input-text.cursor-default:-moz-read-only,.input-text-with-icon.cursor-default:-moz-read-only,.input-text-with-prefix.cursor-default:-moz-read-only,.input-text-with-suffix.cursor-default:-moz-read-only,.input-text.cursor-default:-moz-read-only{cursor:default}.input-group:focus-within .input-text-with-icon.cursor-default:read-only,.input-group:focus-within .input-text-with-prefix.cursor-default:read-only,.input-group:focus-within .input-text-with-suffix.cursor-default:read-only,.input-group:focus-within .input-text.cursor-default:read-only,.input-text-with-icon.cursor-default:read-only,.input-text-with-prefix.cursor-default:read-only,.input-text-with-suffix.cursor-default:read-only,.input-text.cursor-default:read-only{cursor:default}.dark .form-select{background-color:var(--theme-color-secondary-900);border-color:var(--theme-color-secondary-700);color:var(--theme-color-secondary-200)}.input-wrapper-with-icon{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-900);margin-top:.5rem;position:relative}.input-text-with-icon{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#e2e8f0;border-radius:.25rem;border-width:1px;display:block;font-size:1rem;line-height:1.5;margin-right:1.5rem;padding:.5rem .75rem;transition:all .1s ease-in;width:100%}.input-text-with-icon::-moz-placeholder{color:#a0aec0;opacity:1}.input-text-with-icon:-ms-input-placeholder{color:#a0aec0;opacity:1}.input-text-with-icon::placeholder{color:#a0aec0;opacity:1}.input-rich-select .input-text-with-icon,.input-text-with-icon{padding:.75rem 1rem}.dark :not(.light).input-text-with-icon{background-color:var(--theme-color-secondary-900);border-color:var(--theme-color-secondary-700)}.input-text-with-icon.shifted{padding:.75rem 3.25rem .75rem .75rem}.dark .input-text-with-icon::-moz-placeholder{color:var(--theme-color-secondary-700)}.dark .input-text-with-icon:-ms-input-placeholder{color:var(--theme-color-secondary-700)}.dark .input-text-with-icon::placeholder{color:var(--theme-color-secondary-700)}.input-group:focus-within .input-text-with-icon{border-color:var(--theme-color-primary-600)}.input-group:focus-within .input-text-with-icon:-moz-read-only,.input-text-with-icon:-moz-read-only{background-color:var(--theme-color-secondary-100);border-color:var(--theme-color-secondary-400);cursor:not-allowed}.input-group:focus-within .input-text-with-icon:read-only,.input-text-with-icon:read-only{background-color:var(--theme-color-secondary-100);border-color:var(--theme-color-secondary-400);cursor:not-allowed}.dark +.input-group:focus-within .input-text-with-icon:-moz-read-only,.dark .input-text-with-icon:-moz-read-only{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-500)}.dark +.input-group:focus-within .input-text-with-icon:read-only,.dark .input-text-with-icon:read-only{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-500)}.input-group:focus-within .input-text-with-icon.cursor-default:-moz-read-only,.input-text-with-icon.cursor-default:-moz-read-only{cursor:default}.input-group:focus-within .input-text-with-icon.cursor-default:read-only,.input-text-with-icon.cursor-default:read-only{cursor:default}.documentation-sidebar .input-icon+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.input-icon{align-items:center;bottom:0;display:flex;position:absolute;top:0}.documentation-sidebar + +.input-prefix+h2:not(.documentation-sidebar h2:first-of-type),.documentation-sidebar .input-prefix-icon+h2:not(.documentation-sidebar h2:first-of-type),.documentation-sidebar + +.input-suffix+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.input-prefix,.input-prefix-icon,.input-suffix{align-items:center;display:flex}.input-prefix,.input-suffix{padding-left:1rem;padding-right:1rem}.input-prefix{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.input-suffix{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.input-text--error .input-suffix{margin-left:2.5rem}.input-text--error .input-suffix .input-icon{left:0;margin-left:-3.25rem;right:auto}.input-text-with-prefix,.input-text-with-suffix{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-color:var(--theme-color-danger-500);border-radius:.25rem;border-width:0;display:block;outline:2px solid transparent;outline-offset:2px;transition:all .1s ease-in;width:100%}.dark .input-text-with-prefix,.dark +.input-text-with-suffix{background-color:var(--theme-color-secondary-900)}.input-text-with-prefix,.input-text-with-suffix{padding:.75rem 1rem}.documentation-sidebar .input-wrapper-with-prefix+h2:not(.documentation-sidebar h2:first-of-type),.documentation-sidebar + +.input-wrapper-with-suffix+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.input-wrapper-with-prefix,.input-wrapper-with-suffix{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:var(--theme-color-secondary-300);border-radius:.25rem;border-width:1px;display:flex}.dark .input-wrapper-with-prefix,.dark +.input-wrapper-with-suffix{background-color:var(--theme-color-secondary-900);border-color:var(--theme-color-secondary-700)}.input-wrapper-with-prefix .input-prefix-icon{color:var(--theme-color-secondary-500)}.dark .input-wrapper-with-prefix .input-prefix-icon{color:var(--theme-color-secondary-700)}.input-wrapper-with-prefix--dirty .input-prefix-icon,.input-wrapper-with-prefix:focus-within .input-prefix-icon{color:var(--theme-color-primary-500)}.dark .input-wrapper-with-prefix--dirty .input-prefix-icon,.dark +.input-wrapper-with-prefix:focus-within .input-prefix-icon{color:var(--theme-color-primary-600)}.input-wrapper-with-prefix .input-prefix{border-right-width:1px}.dark .input-wrapper-with-prefix .input-prefix{border-color:var(--theme-color-secondary-700)}.input-wrapper-with-suffix .input-suffix{border-left-width:1px}.input-wrapper-with-prefix .input-prefix,.input-wrapper-with-suffix .input-suffix{border-color:var(--theme-color-secondary-300);color:var(--theme-color-secondary-500);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dark .input-wrapper-with-prefix .input-prefix,.dark +.input-wrapper-with-suffix .input-suffix{border-color:var(--theme-color-secondary-700)}.input-radio{color:var(--theme-color-success-600);height:1rem;transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.input-radio[disabled]{background-color:var(--theme-color-secondary-100);border-color:var(--theme-color-secondary-300);color:var(--theme-color-secondary-300)}.input-radio:checked[disabled]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='gray' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-radio:checked.radio-checkmark{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 17 13'%3E%3Cpath d='M13.9.2 6.4 7.4 2.9 4 .4 6.4l6 5.8 10-9.6L13.9.2z'/%3E%3C/svg%3E");background-origin:content-box;color:var(--theme-color-success-500);padding:2px}.input-checkbox{border-color:var(--theme-color-secondary-300);border-width:2px;color:var(--theme-color-success-600);height:1rem;transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.dark .input-checkbox{background-color:transparent;border-color:var(--theme-color-secondary-800)}.dark .input-checkbox:checked{background-color:var(--theme-color-success-600);border-color:var(--theme-color-success-600)}.input-checkbox[disabled]{background-color:var(--theme-color-secondary-100);border-color:var(--theme-color-secondary-300);color:var(--theme-color-secondary-300)}.input-checkbox:checked[disabled]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='gray' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.input-switch-button-left{--tw-translate-x:100%}.input-switch-button-left,.input-switch-button-right{background-color:var(--theme-color-primary-600);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.input-switch-button-right{--tw-translate-x:0px}.input-switch-button-left:hover,.input-switch-button-right:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.input-group:focus-within .input-label--error,.input-group:hover .input-label--error,.input-label--error{color:var(--theme-color-danger-500)}.dark .input-group:focus-within .input-label--error,.dark .input-group:hover .input-label--error,.dark .input-label--error{color:var(--theme-color-danger-400)}.input-text--error,.input-text-with-icon--error{border-color:var(--theme-color-danger-500)}.input-text--error:not(.input-wrapper-with-suffix),.input-text-with-icon--error{margin-right:0;padding-right:2.5rem}.dark .input-text--error,.dark .input-text-with-icon--error{border-color:var(--theme-color-danger-400)}.input-text--error.shifted{padding-right:6rem}.input-group:focus-within .input-text--error,.input-group:focus-within .input-text-with-icon--error,.input-text--error:focus,.input-text-with-icon--error:focus{--tw-ring-color:var(--theme-color-danger-300);border-color:var(--theme-color-danger-300)}.input-text--error::-moz-placeholder,.input-text-with-icon--error::-moz-placeholder{color:var(--theme-color-danger-300)}.input-text--error:-ms-input-placeholder,.input-text-with-icon--error:-ms-input-placeholder{color:var(--theme-color-danger-300)}.input-text--error::placeholder,.input-text-with-icon--error::placeholder{color:var(--theme-color-danger-300)}.input-help--error{color:var(--theme-color-danger-500);font-size:.875rem;line-height:1.25rem;margin-top:.5rem}.tags-input-focus{border-color:var(--theme-color-primary-600);box-shadow:0 0 0 1px var(--theme-color-primary-600)}.documentation-sidebar .taggle_list+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.taggle_list{display:flex;flex-wrap:wrap;margin-bottom:-.25rem}.taggle_list li{display:inline;font-weight:500;margin-bottom:.25rem;margin-right:.5rem;vertical-align:baseline;white-space:nowrap}.documentation-sidebar .taggle_list .taggle+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.taggle_list .taggle{align-items:center;display:flex}.taggle_list .taggle>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.taggle_list .taggle{background-color:var(--theme-color-primary-100);border-radius:.25rem;overflow:auto;padding-left:.5rem;padding-right:.25rem}.dark .taggle_list .taggle{background-color:var(--theme-color-secondary-800)}.taggle_list .taggle{padding-bottom:.25rem!important;padding-top:.25rem!important}.taggle_list .taggle .close{align-items:center;background-color:var(--theme-color-primary-200);border-radius:.25rem;color:var(--theme-color-secondary-900);cursor:pointer;font-size:1.125rem;line-height:.75rem;padding:.25rem;pointer-events:none;right:.5rem;-webkit-text-decoration-line:none;text-decoration-line:none;white-space:nowrap}.simple-markdown a:is(.taggle_list .taggle .close):hover{text-decoration:none}.dark .taggle_list .taggle .close{background-color:var(--theme-color-secondary-700)}.taggle_list .taggle:hover{padding-bottom:.5rem;padding-top:.5rem;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.taggle_list .taggle:hover>.close{opacity:1;pointer-events:auto}.taggle_list .taggle .close:hover{color:var(--theme-color-primary-600)}.dark .taggle_list .taggle .close:hover{color:var(--theme-color-secondary-200)}.taggle_placeholder{border-radius:.25rem;color:var(--theme-color-secondary-400);left:0;max-width:100%;overflow:hidden;padding:.75rem;pointer-events:none;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap}.dark .taggle_placeholder{color:var(--theme-color-secondary-700)}.taggle_input{background-color:transparent;margin-bottom:.25rem;margin-top:.25rem;max-width:100%}.taggle_sizer{margin:0;padding:0;position:absolute;top:-500px;visibility:hidden;z-index:-1}.taggle_text{color:var(--theme-color-primary-600);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dark .taggle_text{color:var(--theme-color-secondary-200)}.taggle>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.taggle{background-color:var(--theme-color-primary-100)}.dark .taggle{background-color:var(--theme-color-secondary-800)}.disabled-tags-input .tags-input-focus{border-color:var(--theme-color-secondary-200)}.dark .disabled-tags-input .tags-input-focus{border-color:var(--theme-color-secondary-800)}.disabled-tags-input .tags-input-focus{box-shadow:0 0 0 1px var(--theme-color-secondary-200)}.dark .disabled-tags-input .tags-input-focus{box-shadow:0 0 0 1px var(--theme-color-secondary-800)}.disabled-tags-input .taggle>.close{pointer-events:all}.disabled-tags-input .taggle_input,.disabled-tags-input .taggle_list,.disabled-tags-input .taggle_placeholder,.disabled-tags-input>div{background-color:var(--theme-color-secondary-100)}.dark .disabled-tags-input .taggle_input,.dark +.disabled-tags-input .taggle_list,.dark +.disabled-tags-input .taggle_placeholder,.dark +.disabled-tags-input>div{background-color:var(--theme-color-secondary-900)}.disabled-tags-input:not(.disabled-tags-input-add) .taggle_list .taggle{padding-right:.5rem}.disabled-tags-input:not(.disabled-tags-input-add) .taggle>.close{display:none}.hide-number-input-arrows input::-webkit-inner-spin-button,.hide-number-input-arrows input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.hide-number-input-arrows input[type=number]{-moz-appearance:textfield}input[type=password]::-ms-clear,input[type=password]::-ms-reveal{display:none}.documentation-sidebar .content-container+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.content-container{display:flex;margin-left:auto;margin-right:auto;padding-left:2rem;padding-right:2rem}@media (min-width:768px){.content-container{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.content-container{max-width:80rem}}.documentation-sidebar .content-container-full-width+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.content-container-full-width{display:flex;margin-left:auto;margin-right:auto}@media (min-width:1024px){.content-container-full-width{max-width:80rem}}.navbar-container{padding-left:2rem;padding-right:2rem}@media (min-width:768px){.navbar-container{padding-left:2.5rem;padding-right:2.5rem}}h1,h2,h3,h4{color:var(--theme-color-secondary-900)}h1,h2,h3,h4{font-weight:700}.dark h1,.dark h2,.dark h3,.dark h4{color:var(--theme-color-secondary-200)}.header-1,.header-2,.header-3,.header-4{color:var(--theme-color-secondary-900);font-weight:700}.dark header-1,.dark header-2,.dark header-3,.dark header-4{color:var(--theme-color-secondary-200)}.header-1,h1{font-size:1.875rem;line-height:2.25rem;margin-bottom:.25rem}.header-2,h2{font-size:1.5rem;line-height:2rem;margin-bottom:.25rem}.header-3,.header-4,h3,h4{font-size:1.125rem;line-height:1.75rem;margin-bottom:.25rem}@media (min-width:768px){.header-1,h1{font-size:2.25rem;line-height:2.5rem;margin-bottom:.5rem}.header-2,h2{font-size:1.875rem;line-height:2.25rem}.header-3,h3{font-size:1.5rem;line-height:2rem}}.header-1,.header-2,.header-3,.header-4,h1,h2,h3,h4{line-height:1.25}a:focus,button:focus,input:focus,textarea:focus{outline:2px solid transparent;outline-offset:2px}button,img{-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.clear-transform{transform:none}.rotate-90{transform:rotate(90deg)}.rotate-180{transform:rotate(180deg)}.rotate-minus-90{transform:rotate(-90deg)}.documentation-sidebar .image-tile+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.image-tile{align-items:center;border-color:var(--theme-color-primary-100);border-radius:.75rem;border-width:1px;display:flex;flex-direction:column;justify-content:space-between;padding:2rem;transition:all .1s ease-in}.image-tile:hover{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:transparent;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transform:scale(1.02)}.documentation-sidebar .logo-entry+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.logo-entry{align-items:center;border-bottom-width:2px;border-color:var(--theme-color-info-100);display:flex;transition:all .1s ease-in}.logo-entry:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);border-color:transparent;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.logo-entry-image{display:block}.logo-entry-image,.logo-entry-image-hover{height:100%;position:absolute;width:100%}.logo-entry-image-hover{visibility:hidden}.logo-entry:hover .logo-entry-image-hover{visibility:visible}.logo-entry:hover .logo-entry-image{visibility:hidden}.logo-simple .logo-simple-image-hover{display:none;left:0;position:absolute;top:0}.logo-simple:hover .logo-simple-image{visibility:hidden}.logo-simple:hover .logo-simple-image-hover{display:block}.picasso circle{mix-blend-mode:soft-light}[x-cloak]{display:none}.video-container{height:0;padding-bottom:56.25%;position:relative}.video-container iframe{height:100%;left:0;position:absolute;top:0;width:100%}.avatar-letters{fill:#fff;stroke:#fff;font-size:1.75rem}.extended-footer-contact input,.extended-footer-contact textarea{background-color:var(--theme-color-secondary-900);border-color:var(--theme-color-secondary-700);color:var(--theme-color-secondary-200)}.extended-footer-contact input[readonly],.extended-footer-contact textarea[readonly]{background-color:var(--theme-color-secondary-800);border-color:var(--theme-color-secondary-700);color:var(--theme-color-secondary-700)}.extended-footer-contact button[type=submit]{--tw-text-opacity:1;background-color:var(--theme-color-primary-600);border-radius:.25rem;color:rgb(255 255 255/var(--tw-text-opacity));font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}.extended-footer-contact button[type=submit]:hover{background-color:var(--theme-color-primary-700)}.extended-footer-contact button[type=submit]:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.dark .extended-footer-contact button[type=submit]:disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}a.extended-footer-contact button[type=submit]{display:inline-block}.dark .extended-footer-contact button[type=submit]:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.swiper{height:100%;margin-left:auto;margin-right:auto;width:100%}.swiper,.swiper:not(.slider-pagination-bottom){margin-top:2rem}.swiper.slider-pagination-bottom{margin-bottom:2rem;margin-top:1.25rem}.swiper:not(.slider-pagination-bottom) .swiper-wrapper{margin-bottom:2rem}.swiper .swiper-pagination{bottom:0;position:relative}.documentation-sidebar .swiper:not(.slider-pagination-bottom) .swiper-pagination+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.swiper:not(.slider-pagination-bottom) .swiper-pagination{align-items:center;display:flex}.swiper.slider-pagination-bottom .swiper-pagination{margin-top:1.25rem}@media (min-width:1280px){.swiper.slider-multirow>.swiper-wrapper{flex-wrap:wrap}}.swiper .swiper-pagination-bullets>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin-left:0;margin-right:0}@media (min-width:640px){.swiper.slider-show-view-all:not(.slider-pagination-bottom) .swiper-pagination-bullets .swiper-pagination-bullet:last-child{margin-right:1.5rem;position:relative}.swiper.slider-show-view-all:not(.slider-pagination-bottom) .swiper-pagination-bullets .swiper-pagination-bullet:last-child:before{background-color:var(--theme-color-secondary-300);margin-top:-.5rem;position:absolute;width:1px}.dark .swiper.slider-show-view-all:not(.slider-pagination-bottom) .swiper-pagination-bullets .swiper-pagination-bullet:last-child:before{background-color:var(--theme-color-secondary-800)}.swiper.slider-show-view-all:not(.slider-pagination-bottom) .swiper-pagination-bullets .swiper-pagination-bullet:last-child:before{content:"";height:calc(100% + 1rem);right:calc(-1.5rem - 1px)}}.swiper-button-next,.swiper-button-prev{padding-bottom:3rem}.swiper-button-next:after,.swiper-button-prev:after{font-size:1.75rem}div.swiper-button-next,div.swipwer-button-prev{color:var(--theme-color-primary-500)}span.swiper-pagination-bullet{opacity:1}.dark span.swiper-pagination-bullet{background-color:var(--theme-color-secondary-600)}span.swiper-pagination-bullet{background-color:rgba(62,157,255,.2)}span.swiper-pagination-bullet-active{background-color:var(--theme-color-primary-500)}.dark span.swiper-pagination-bullet-active{background-color:var(--theme-color-primary-600)}.slider-title{align-items:flex-end;flex:1 1 0%;margin-bottom:0;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.swiper-pagination-bullet:only-child,.swiper-wrapper.grid .swiper-slide:nth-child(n+2){display:none}@media (min-width:640px){.swiper-wrapper.grid.sm\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.sm\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.sm\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.sm\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid.sm\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.grid.sm\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.grid.sm\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.grid.sm\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:768px){.swiper-wrapper.grid.md\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.md\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.md\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.md\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid.md\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.grid.md\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.grid.md\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.grid.md\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1024px){.swiper-wrapper.grid.lg\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.lg\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.lg\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.lg\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid.lg\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.grid.lg\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.grid.lg\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.grid.lg\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}@media (min-width:1280px){.swiper-wrapper.grid.xl\:grid-cols-1 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.xl\:grid-cols-2 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.xl\:grid-cols-3 .swiper-slide:nth-child(n+0),.swiper-wrapper.grid.xl\:grid-cols-4 .swiper-slide:nth-child(n+0){display:block}.swiper-wrapper.grid.xl\:grid-cols-1 .swiper-slide:nth-child(n+2),.swiper-wrapper.grid.xl\:grid-cols-2 .swiper-slide:nth-child(n+3),.swiper-wrapper.grid.xl\:grid-cols-3 .swiper-slide:nth-child(n+4),.swiper-wrapper.grid.xl\:grid-cols-4 .swiper-slide:nth-child(n+5){display:none}}.table-container table{height:100%;text-align:left;width:100%}.table-container table>tbody>tr>td.hoverable-cell:is(.table-container table)>div.table-cell-content{justify-content:flex-start}.table-container table thead{color:var(--theme-color-secondary-500);font-size:.875rem;font-weight:600;line-height:1.25rem}.table-container table thead tr{border-bottom-width:1px;border-color:var(--theme-color-secondary-300);text-align:left}.table-container table>tbody>tr>td.hoverable-cell:is(.table-container table thead tr)>div.table-cell-content{justify-content:flex-start}.dark .table-container table tbody tr,.dark .table-container table thead th:not(:last-child):after,.dark .table-container table thead tr{border-color:var(--theme-color-secondary-800)}.table-container table thead th{padding:.75rem;position:relative}.table-container table thead th:after{border-color:var(--theme-color-secondary-300);border-left-width:1px;height:50%;position:absolute;right:0;top:25%}.table-container table thead th:not(:last-child):not(.last-cell):after{content:""}@media (min-width:640px){.table-container table thead th.last-cell-sm:after{content:""}}@media (min-width:768px){.table-container table thead th.last-cell-md:after{content:""}}@media (min-width:1024px){.table-container table thead th.last-cell-lg:after{content:""}}@media (min-width:1280px){.table-container table thead th.last-cell-xl:after{content:""}}.table-container table tbody td{line-height:1.25rem;padding:1rem .75rem}.table-container table tbody tr{border-bottom:1px var(--theme-color-secondary-300);border-left-color:var(--theme-color-secondary-300);border-right-color:var(--theme-color-secondary-300);border-style:dashed;border-top-color:var(--theme-color-secondary-300)}.table-container table tbody tr:last-child{border-width:0}.dark .table-container{color:var(--theme-color-secondary-500)}.documentation-sidebar .table-list-mobile-row+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.table-list-mobile-row{display:flex;flex-direction:column;width:100%}.table-list-mobile-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.table-list-mobile-row{border-color:var(--theme-color-secondary-300);border-top-width:1px;padding-bottom:1.5rem;padding-top:1.5rem}.table-list-mobile-row:first-child{border-top-width:0;padding-top:0}.dark .table-list-mobile-row{border-color:var(--theme-color-secondary-800)}.documentation-sidebar .table-list-mobile-row>div:not(.table-list-mobile-name)+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.table-list-mobile-row>div:not(.table-list-mobile-name){display:flex;justify-content:space-between;width:100%}.documentation-sidebar .table-list-mobile-name+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.table-list-mobile-name{align-items:center;display:flex;margin-bottom:.5rem}.table-list-mobile-name>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.table-list-mobile-name{font-size:1.125rem;line-height:1.75rem}@media (min-width:768px){.table-list-mobile{display:none}}.table-container .table-wrapper{scrollbar-color:#e5f0f8 #bad6f0}.table-container .table-wrapper::-webkit-scrollbar{background-color:var(--theme-color-primary-100);border-radius:.5rem;height:6px;width:6px}.table-container .table-wrapper::-webkit-scrollbar-thumb{background-color:var(--theme-color-primary-200);border-radius:.5rem}.table-container table tbody td.hoverable-cell{padding:.125rem 0}.table-container table tbody tr{outline:2px solid transparent;outline-offset:2px}.table-container table>tbody>tr>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell:first-child>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell:last-child>div.table-cell-bg:before{border-bottom-width:1px;border-color:transparent;border-top-width:1px;content:"";display:block;height:100%;position:absolute;top:0;width:1rem}.table-container table>tbody>tr>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell:first-child>div.table-cell-bg:before{border-bottom-left-radius:.75rem;border-left-width:1px;border-top-left-radius:.75rem;left:0;margin-left:-1rem}.table-container table>tbody>tr>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell:last-child>div.table-cell-bg:before{border-bottom-right-radius:.75rem;border-right-width:1px;border-top-right-radius:.75rem;margin-right:-1rem;right:0}.table-container table>tbody>tr>td.hoverable-cell{position:relative}.documentation-sidebar .table-container table>tbody>tr>td.hoverable-cell>div.table-cell-content+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.table-container table>tbody>tr>td.hoverable-cell>div.table-cell-content{align-items:center;display:flex;padding-left:.75rem;padding-right:.75rem;position:relative}.table-container table>tbody>tr>td.hoverable-cell>div.table-cell-bg{--tw-border-opacity:1;border-bottom-width:2px;border-color:rgb(255 255 255/var(--tw-border-opacity));border-top-width:2px;height:100%;left:0;position:absolute;top:0;width:100%}.dark .table-container table>tbody>tr>td.hoverable-cell>div.table-cell-bg{border-color:var(--theme-color-secondary-900)}.table-container table>tbody>tr>td.hoverable-cell.text-right>div.table-cell-content{justify-content:flex-end}.table-container table>tbody>tr>td.hoverable-cell:is(.text-left)>div.table-cell-content{justify-content:flex-start}.table-container table>tbody>tr>td.hoverable-cell>div.table-cell-bg:after{border-bottom-width:1px;border-color:transparent;border-top-width:1px;bottom:0;content:"";height:100%;left:0;pointer-events:none;position:absolute;right:0;top:0;width:100%}.table-container table>tbody>tr:focus>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr:focus>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr:focus>td.hoverable-cell:first-child>div.table-cell-bg:before,.table-container table>tbody>tr:focus>td.hoverable-cell:last-child>div.table-cell-bg:before,.table-container table>tbody>tr:focus>td.hoverable-cell>div.table-cell-bg,.table-container table>tbody>tr:hover>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr:hover>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr:hover>td.hoverable-cell:first-child>div.table-cell-bg:before,.table-container table>tbody>tr:hover>td.hoverable-cell:last-child>div.table-cell-bg:before,.table-container table>tbody>tr:hover>td.hoverable-cell>div.table-cell-bg{background-color:var(--theme-color-secondary-100)}.table-container table>tbody>tr[data-danger]:hover>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-danger]:hover>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-danger]:hover>td.hoverable-cell:first-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-danger]:hover>td.hoverable-cell:last-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-danger]:hover>td.hoverable-cell>div.table-cell-bg{background-color:var(--theme-color-danger-100)}.table-container table>tbody>tr[data-warning]:hover>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-warning]:hover>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-warning]:hover>td.hoverable-cell:first-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-warning]:hover>td.hoverable-cell:last-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-warning]:hover>td.hoverable-cell>div.table-cell-bg{background-color:var(--theme-color-warning-100)}.table-container table>tbody>tr[data-info]:hover>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-info]:hover>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-info]:hover>td.hoverable-cell:first-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-info]:hover>td.hoverable-cell:last-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-info]:hover>td.hoverable-cell>div.table-cell-bg{background-color:var(--theme-color-info-100)}.table-container table>tbody>tr[data-success]:hover>td.hoverable-cell.first-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-success]:hover>td.hoverable-cell.last-cell>div.table-cell-bg:before,.table-container table>tbody>tr[data-success]:hover>td.hoverable-cell:first-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-success]:hover>td.hoverable-cell:last-child>div.table-cell-bg:before,.table-container table>tbody>tr[data-success]:hover>td.hoverable-cell>div.table-cell-bg{background-color:var(--theme-color-success-100)}.dark .table-container table>tbody>tr:hover>td.hoverable-cell.first-cell>div.table-cell-bg:before,.dark .table-container table>tbody>tr:hover>td.hoverable-cell.last-cell>div.table-cell-bg:before,.dark .table-container table>tbody>tr:hover>td.hoverable-cell:first-child>div.table-cell-bg:before,.dark .table-container table>tbody>tr:hover>td.hoverable-cell:last-child>div.table-cell-bg:before,.dark .table-container table>tbody>tr:hover>td.hoverable-cell>div.table-cell-bg{--tw-bg-opacity:1!important;background-color:rgb(18 18 19/var(--tw-bg-opacity))!important}.table-container table tbody td.hoverable-cell:last-child .table-cell-content,.table-container table thead th.last-until-lg,.table-container table thead th.last-until-md,.table-container table thead th.last-until-sm,.table-container table thead th.last-until-xl,.table-container table thead th:last-child{padding-right:0}.table-container table tbody td.hoverable-cell:first-child .table-cell-content,.table-container table thead th:first-child{padding-left:0}@media (min-width:640px){.table-container table>tbody>tr>td.hoverable-cell.first-cell-sm>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell.last-cell-sm>div.table-cell-bg:before{content:none}.table-container table thead th.last-until-sm{padding-right:.75rem}}@media (min-width:768px){.table-container table>tbody>tr>td.hoverable-cell.first-cell-md>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell.last-cell-md>div.table-cell-bg:before{content:none}.table-container table thead th.last-until-md{padding-right:.75rem}}@media (min-width:1024px){.table-container table>tbody>tr>td.hoverable-cell.first-cell-lg>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell.last-cell-lg>div.table-cell-bg:before{content:none}.table-container table thead th.last-until-lg{padding-right:.75rem}}@media (min-width:1280px){.table-container table>tbody>tr>td.hoverable-cell.first-cell-xl>div.table-cell-bg:before,.table-container table>tbody>tr>td.hoverable-cell.last-cell-xl>div.table-cell-bg:before{content:none}.table-container table thead th.last-until-xl{padding-right:.75rem}}.table-container table>tbody>tr[data-warning]>td.hoverable-cell>div.table-cell-bg,.table-container table>tbody>tr[data-warning]>td.hoverable-cell>div.table-cell-bg:before{background-color:var(--theme-color-warning-50)}.table-container table>tbody>tr[data-info]>td.hoverable-cell>div.table-cell-bg,.table-container table>tbody>tr[data-info]>td.hoverable-cell>div.table-cell-bg:before{background-color:var(--theme-color-primary-50)}.table-container table>tbody>tr[data-success]>td.hoverable-cell>div.table-cell-bg,.table-container table>tbody>tr[data-success]>td.hoverable-cell>div.table-cell-bg:before{background-color:var(--theme-color-success-50)}.table-container table>tbody>tr[data-danger]>td.hoverable-cell>div.table-cell-bg,.table-container table>tbody>tr[data-danger]>td.hoverable-cell>div.table-cell-bg:before{background-color:var(--theme-color-danger-50)}.dark .table-container table>tbody>tr[data-warning]>td.hoverable-cell>div.table-cell-bg:after,.dark .table-container table>tbody>tr[data-warning]>td.hoverable-cell>div.table-cell-bg:before{border-color:var(--theme-color-warning-500)}.dark .table-container table>tbody>tr[data-info]>td.hoverable-cell>div.table-cell-bg:after,.dark .table-container table>tbody>tr[data-info]>td.hoverable-cell>div.table-cell-bg:before{border-color:var(--theme-color-primary-600)}.dark .table-container table>tbody>tr[data-success]>td.hoverable-cell>div.table-cell-bg:after,.dark .table-container table>tbody>tr[data-success]>td.hoverable-cell>div.table-cell-bg:before{border-color:var(--theme-color-success-600)}.dark .table-container table>tbody>tr[data-danger]>td.hoverable-cell>div.table-cell-bg:after,.dark .table-container table>tbody>tr[data-danger]>td.hoverable-cell>div.table-cell-bg:before{border-color:var(--theme-color-danger-300)}.dark .table-container table>tbody>tr[data-danger]>td.hoverable-cell>div.table-cell-bg,.dark .table-container table>tbody>tr[data-danger]>td.hoverable-cell>div.table-cell-bg:before,.dark .table-container table>tbody>tr[data-info]>td.hoverable-cell>div.table-cell-bg,.dark .table-container table>tbody>tr[data-info]>td.hoverable-cell>div.table-cell-bg:before,.dark .table-container table>tbody>tr[data-success]>td.hoverable-cell>div.table-cell-bg,.dark .table-container table>tbody>tr[data-success]>td.hoverable-cell>div.table-cell-bg:before,.dark .table-container table>tbody>tr[data-warning]>td.hoverable-cell>div.table-cell-bg,.dark .table-container table>tbody>tr[data-warning]>td.hoverable-cell>div.table-cell-bg:before{background-color:transparent}.table-container table:not(.table-compact)>tbody>tr>td.hoverable-cell>div.table-cell-content,body:not(.table-compact) .table-container>tbody>tr>td.hoverable-cell>div.table-cell-content{padding-bottom:1rem;padding-top:1rem}.table-container table.table-compact>tbody>tr>td.hoverable-cell>div.table-cell-content,body.table-compact .table-container table>tbody>tr>td.hoverable-cell>div.table-cell-content{padding-bottom:.75rem;padding-top:.75rem}@media (min-width:640px){.table-container table.table-compact.table-compact-until-sm>tbody>tr>td.hoverable-cell>div.table-cell-content,body.table-compact.table-compact-until-sm .table-container table>tbody>tr>td.hoverable-cell>div.table-cell-content{padding-bottom:1rem;padding-top:1rem}}@media (min-width:768px){.table-container table.table-compact.table-compact-until-md>tbody>tr>td.hoverable-cell>div.table-cell-content,body.table-compact.table-compact-until-md .table-container table>tbody>tr>td.hoverable-cell>div.table-cell-content{padding-bottom:1rem;padding-top:1rem}}@media (min-width:1024px){.table-container table.table-compact.table-compact-until-lg>tbody>tr>td.hoverable-cell>div.table-cell-content,body.table-compact.table-compact-until-lg .table-container table>tbody>tr>td.hoverable-cell>div.table-cell-content{padding-bottom:1rem;padding-top:1rem}}@media (min-width:1280px){.table-container table.table-compact.table-compact-until-xl>tbody>tr>td.hoverable-cell>div.table-cell-content,body.table-compact.table-compact-until-xl .table-container table>tbody>tr>td.hoverable-cell>div.table-cell-content{padding-bottom:1rem;padding-top:1rem}}.table-container table.sticky-headers th{--tw-bg-opacity:1;background-clip:padding-box;background-color:rgb(255 255 255/var(--tw-bg-opacity));box-shadow:inset 0 -1px 0 var(--theme-color-secondary-300);position:-webkit-sticky;position:sticky;z-index:5}.dark .table-container table.sticky-headers th{box-shadow:inset 0 -1px 0 var(--theme-color-secondary-800)}.table-container table.sticky-headers th.last-cell:before,.table-container table.sticky-headers th:first-child:before,.table-container table.sticky-headers th:last-child:before{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:var(--theme-color-secondary-300);border-width:0;content:"";height:100%;position:absolute;top:0;width:1rem}.dark .table-container table.sticky-headers th:first-child:before,.dark .table-container table.sticky-headers th:last-child:before{background-color:var(--theme-color-secondary-900);border-color:var(--theme-color-secondary-800)}.table-container table.sticky-headers th.first-cell:before,.table-container table.sticky-headers th:first-child:before{left:0;margin-left:-1rem}.table-container table.sticky-headers th.last-cell:before,.table-container table.sticky-headers th:last-child:before{margin-right:-1rem;right:0}.dark .table-container table.sticky-headers th.last-cell:before{background-color:var(--theme-color-secondary-900)}@media (min-width:1280px){.table-container table.sticky-headers th.last-cell-xl:before{border-left-width:1px;border-right-width:0;height:50%;margin-right:0;position:absolute;right:0;top:25%;width:auto}}@media (min-width:1024px){.table-container table.sticky-headers th.last-cell-lg:before{border-left-width:1px;border-right-width:0;height:50%;margin-right:0;position:absolute;right:0;top:25%;width:auto}}@media (min-width:768px){.table-container table.sticky-headers th.last-cell-md:before{border-left-width:1px;border-right-width:0;height:50%;margin-right:0;position:absolute;right:0;top:25%;width:auto}}@media (min-width:640px){.table-container table.sticky-headers th.last-cell-sm:before{border-left-width:1px;border-right-width:0;height:50%;margin-right:0;position:absolute;right:0;top:25%;width:auto}}.dark .table-container table.sticky-headers th{background-color:var(--theme-color-secondary-900)}.table-container table.sticky-headers thead tr{border-style:none}:root{--theme-color-primary-rgb:9,100,228;--theme-color-primary-50:#f5faff;--theme-color-primary-100:#e5f0f8;--theme-color-primary-200:#bad6f0;--theme-color-primary-300:#99c7ee;--theme-color-primary-400:#77b9f3;--theme-color-primary-500:#3e9dff;--theme-color-primary-600:#007dff;--theme-color-primary-700:#075af2;--theme-color-primary-800:#0b4dc7;--theme-color-primary-900:#173e85;--theme-color-secondary-50:#fcfdfd;--theme-color-secondary-100:#f7fafb;--theme-color-secondary-200:#eef3f5;--theme-color-secondary-300:#dbdee5;--theme-color-secondary-400:#c4c8cf;--theme-color-secondary-500:#a5adb9;--theme-color-secondary-600:#7e8a9c;--theme-color-secondary-700:#637282;--theme-color-secondary-800:#3c4249;--theme-color-secondary-900:#212225;--theme-color-danger-50:#fff5f2;--theme-color-danger-100:#ffe0da;--theme-color-danger-200:#feb8ae;--theme-color-danger-300:#ef7c6d;--theme-color-danger-400:#de5846;--theme-color-danger-500:#c9292c;--theme-color-danger-600:#b01e20;--theme-color-danger-700:#881a1b;--theme-color-danger-800:#5b1b1b;--theme-color-danger-900:#391919;--theme-color-warning-50:#fff8eb;--theme-color-warning-100:#ffe6b8;--theme-color-warning-200:#ffd486;--theme-color-warning-300:#ffc359;--theme-color-warning-400:#feb933;--theme-color-warning-500:#ffae10;--theme-color-warning-600:#fc9f0f;--theme-color-warning-700:#f88e0d;--theme-color-warning-800:#f27c0b;--theme-color-warning-900:#ec5c08;--theme-color-success-50:#f1fbf4;--theme-color-success-100:#e2f0e6;--theme-color-success-200:#b0dbbc;--theme-color-success-300:#8cc69d;--theme-color-success-400:#60c07c;--theme-color-success-500:#42b263;--theme-color-success-600:#289548;--theme-color-success-700:#307845;--theme-color-success-800:#2b4f35;--theme-color-success-900:#26372b;--theme-color-info-50:#f5faff;--theme-color-info-100:#e5f0f8;--theme-color-info-200:#bad6f0;--theme-color-info-300:#99c7ee;--theme-color-info-400:#77b9f3;--theme-color-info-500:#3e9dff;--theme-color-info-600:#007dff;--theme-color-info-700:#075af2;--theme-color-info-800:#0b4dc7;--theme-color-info-900:#173e85;--theme-color-hint-50:#f5f5ff;--theme-color-hint-100:#e5e5ff;--theme-color-hint-200:#d6d5ff;--theme-color-hint-300:#9c9aff;--theme-color-hint-400:#6e6cef;--theme-color-hint-500:#5b59dc;--theme-color-hint-600:#5452ce;--theme-color-hint-700:#4745b0;--theme-color-hint-800:#363383;--theme-color-hint-900:#212052;--theme-color-white:#fff}.simple-markdown{color:var(--theme-color-secondary-700);overflow-wrap:break-word}.simple-markdown p{line-height:1.75rem}.simple-markdown p+p{margin-top:0}.simple-markdown .heading-permalink{display:none}.simple-markdown ul{list-style-type:disc}.simple-markdown ol,.simple-markdown ul{list-style-position:outside;margin-bottom:0;padding-left:1rem}.simple-markdown ol{list-style-type:decimal}.simple-markdown ol ul,.simple-markdown ul ul{list-style-position:outside;list-style-type:circle;margin-bottom:0;margin-left:1rem}.simple-markdown ol ol,.simple-markdown ul ol{list-style-position:outside;list-style-type:lower-latin;margin-bottom:0;margin-left:1rem}.simple-markdown ol>li,.simple-markdown ul>li{padding-bottom:.5rem}.simple-markdown blockquote{border-left-width:2px;color:var(--theme-color-secondary-500);font-style:italic;line-height:1.75rem;padding-left:1.5rem}.simple-markdown h3{margin-top:1rem}.simple-markdown h4{margin-top:.5rem}.simple-markdown ul{margin-bottom:.5rem}.simple-markdown p{padding-bottom:.5rem}.simple-markdown a{color:var(--theme-color-primary-600);font-weight:600;-webkit-text-decoration-line:none;text-decoration-line:none;transition:all .1s ease-in}.simple-markdown a:is(.simple-markdown a):hover{text-decoration:none}.simple-markdown a[target=_blank]:hover{-webkit-text-decoration-line:none;text-decoration-line:none}.simple-markdown a:is(.simple-markdown a[target=_blank]:hover):hover{text-decoration:none}.simple-markdown a:hover,.simple-markdown a[target=_blank]:hover>span{-webkit-text-decoration-line:underline;text-decoration-line:underline}.simple-markdown a:hover{color:var(--theme-color-primary-700)}.simple-markdown a:is(.no-underline):hover{text-decoration:none}.simple-markdown a:active{color:var(--theme-color-primary-400)}.simple-markdown table{text-align:left;width:100%}.table-container table>tbody>tr>td.hoverable-cell:is(.simple-markdown table)>div.table-cell-content{justify-content:flex-start}.simple-markdown table thead{color:var(--theme-color-secondary-500);font-size:.875rem;font-weight:600;line-height:1.25rem}.simple-markdown table thead tr{border-bottom-width:1px;border-color:var(--theme-color-secondary-300);text-align:left}.table-container table>tbody>tr>td.hoverable-cell:is(.simple-markdown table thead tr)>div.table-cell-content{justify-content:flex-start}.simple-markdown table thead th{padding:.75rem;position:relative}.simple-markdown table thead th:not(:last-child):after{border-color:var(--theme-color-secondary-300);border-left-width:1px;content:"";height:50%;position:absolute;right:0}.simple-markdown table tbody td{line-height:1.25rem;padding:1rem .75rem}.simple-markdown table tbody tr{border-bottom:1px var(--theme-color-secondary-300);border-left-color:var(--theme-color-secondary-300);border-right-color:var(--theme-color-secondary-300);border-style:dashed;border-top-color:var(--theme-color-secondary-300)}.simple-markdown table tbody tr:last-child{border-width:0}.simple-markdown .table-wrapper{scrollbar-color:#e5f0f8 #bad6f0}.simple-markdown .table-wrapper::-webkit-scrollbar{background-color:var(--theme-color-primary-100);border-radius:.5rem;height:4px;width:6px}.simple-markdown .table-wrapper::-webkit-scrollbar-track-piece:start{background:transparent}.simple-markdown .table-wrapper::-webkit-scrollbar-thumb{background-color:var(--theme-color-primary-200);border-radius:.5rem}.simple-markdown .table-wrapper{scrollbar-color:#bad6f0 transparent}.simple-markdown .cookie-policy-table tbody>tr>td:nth-of-type(3){min-width:32rem}.light-dark-icon{--icon-color-primary-100:var(--theme-color-primary-100);--icon-color-primary-200:var(--theme-color-primary-200);--icon-color-secondary-200:var(--theme-color-secondary-200);--icon-color-secondary-300:var(--theme-color-secondary-300);--icon-color-secondary-900:var(--theme-color-secondary-900);--icon-color-success-50:var(--theme-color-success-50);--icon-color-warning-100:var(--theme-color-warning-100);--icon-color-danger-100:var(--theme-color-danger-100);--icon-error-primary-100:var(--theme-color-primary-100);--icon-error-primary-600:var(--theme-color-primary-600);--icon-error-secondary-200:var(--theme-color-secondary-200);--icon-error-secondary-300:var(--theme-color-secondary-300);--icon-error-secondary-900:var(--theme-color-secondary-900)}.dark .light-dark-icon{--icon-color-primary-100:var(--theme-color-primary-900);--icon-color-primary-200:var(--theme-color-primary-900);--icon-color-secondary-200:var(--theme-color-secondary-800);--icon-color-secondary-300:var(--theme-color-secondary-800);--icon-color-secondary-900:var(--theme-color-secondary-600);--icon-color-success-50:var(--theme-color-success-800);--icon-color-warning-100:var(--theme-color-warning-900);--icon-color-danger-100:var(--theme-color-danger-800);--icon-error-primary-100:var(--theme-color-primary-900);--icon-error-primary-600:var(--theme-color-primary-600);--icon-error-secondary-300:var(--theme-color-secondary-800)}.ark-logo-red{--icon-color-secondary:#fff;color:var(--theme-color-danger-500)}.cookie-banner-theme{--cc-bg:var(--theme-color-white);--cc-btn-primary-bg:var(--theme-color-primary-600);--cc-btn-primary-text:var(--theme-color-white);--cc-btn-primary-hover-bg:var(--theme-color-primary-700);--cc-btn-secondary-bg:var(--theme-color-primary-100);--cc-btn-secondary-text:var(--theme-color-primary-600);--cc-btn-secondary-hover-bg:var(--theme-color-primary-700);--cc-btn-secondary-hover-text:var(--theme-color-white);--cc-cookie-category-block-bg:var(--theme-color-white);--cc-block-text:var(--theme-color-secondary-700);--cc-section-border:transparent;--cc-toggle-knob-bg:var(--theme-color-white);--cc-toggle-knob-icon-color:var(--theme-color-white)}.dark .cookie-banner-theme{--cc-bg:var(--theme-color-secondary-900);--cc-btn-secondary-bg:var(--theme-color-secondary-800);--cc-btn-secondary-text:var(--theme-color-secondary-200);--cc-block-text:var(--theme-color-secondary-500);--cc-cookie-table-border:var(--theme-color-secondary-800);--cc-toggle-knob-bg:var(--theme-color-secondary-600);--cc-toggle-knob-icon-color:var(--theme-color-secondary-600)}#cc--main{--cc-bg:var(--theme-color-white);--cc-btn-primary-bg:var(--theme-color-primary-600);--cc-btn-primary-text:var(--theme-color-white);--cc-btn-primary-hover-bg:var(--theme-color-primary-700);--cc-btn-secondary-bg:var(--theme-color-primary-100);--cc-btn-secondary-text:var(--theme-color-primary-600);--cc-btn-secondary-hover-bg:var(--theme-color-primary-700);--cc-btn-secondary-hover-text:var(--theme-color-white);--cc-cookie-category-block-bg:var(--theme-color-white);--cc-block-text:var(--theme-color-secondary-700);--cc-section-border:transparent;--cc-toggle-knob-bg:var(--theme-color-white);--cc-toggle-knob-icon-color:var(--theme-color-white)}.dark #cc--main{--cc-bg:var(--theme-color-secondary-900);--cc-btn-secondary-bg:var(--theme-color-secondary-800);--cc-btn-secondary-text:var(--theme-color-secondary-200);--cc-block-text:var(--theme-color-secondary-500);--cc-cookie-table-border:var(--theme-color-secondary-800);--cc-toggle-knob-bg:var(--theme-color-secondary-600);--cc-toggle-knob-icon-color:var(--theme-color-secondary-600)}.cc_div #c-bns button:last-of-type:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.cc_div #c-ttl{color:var(--theme-color-secondary-900);font-size:1.125rem;line-height:2rem}.cc_div #c-txt{font-size:.875rem;line-height:1.25rem;line-height:1.5}@media (min-width:768px){.cc_div #s-hdr #s-ttl{font-size:1.875rem;line-height:2.25rem}}.cc_div #s-hdr #s-ttl{color:var(--theme-color-secondary-900);font-size:1.5rem;font-weight:700;line-height:1.25;line-height:2rem;margin-bottom:.25rem}a.cc_div .c-bl>div a.focus-visible,a +.cc_div button.preferences-button.focus-visible,button.cc_div .c-bl>div a.focus-visible,button +.cc_div button.preferences-button.focus-visible{border-radius:.25rem}a.cc_div .c-bl>div a:focus-visible,a +.cc_div button.preferences-button:focus-visible,button.cc_div .c-bl>div a:focus-visible,button +.cc_div button.preferences-button:focus-visible{border-radius:.25rem}.cc_div .c-bl>div a,.cc_div button.preferences-button{color:var(--theme-color-primary-600);cursor:pointer;font-weight:600;-webkit-text-decoration-line:none;text-decoration-line:none;transition:all .1s ease-in}.simple-markdown a:is(.cc_div .c-bl>div a):hover,.simple-markdown a:is(.cc_div button.preferences-button):hover{text-decoration:none}.cc_div .c-bl>div a.read-only,.cc_div button.preferences-button.read-only{cursor:not-allowed}.cc_div .c-bl>div a:hover,.cc_div button.preferences-button:hover{color:var(--theme-color-primary-700);-webkit-text-decoration-line:underline;text-decoration-line:underline}.cc_div .c-bl>div a.link-no-underline:hover,.cc_div button.preferences-button.link-no-underline:hover{-webkit-text-decoration-line:none;text-decoration-line:none}.simple-markdown a:is(.cc_div .c-bl>div a.link-no-underline:hover):hover,.simple-markdown a:is(.cc_div button.preferences-button.link-no-underline:hover):hover{text-decoration:none}.cc_div .c-bl>div a:active,.cc_div button.preferences-button:active{color:var(--theme-color-primary-400)}.description-block-link:hover .cc_div .c-bl>div a,.description-block-link:hover +.cc_div button.preferences-button{color:var(--theme-color-primary-700);-webkit-text-decoration-line:underline;text-decoration-line:underline}.cc_div #s-bns #s-all-bn{--tw-text-opacity:1;background-color:var(--theme-color-primary-600);border-radius:.25rem;color:rgb(255 255 255/var(--tw-text-opacity));font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}.cc_div #s-bns #s-all-bn:hover{background-color:var(--theme-color-primary-700)}.cc_div #s-bns #s-all-bn:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.dark .cc_div #s-bns #s-all-bn:disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}a.cc_div #s-bns #s-all-bn{display:inline-block}.cc_div #s-bns #s-rall-bn:disabled,.cc_div #s-bns #s-sv-bn:disabled,.dark .cc_div #s-bns #s-all-bn:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.cc_div #s-bns #s-rall-bn:disabled,.cc_div #s-bns #s-sv-bn:disabled{background-color:var(--theme-color-secondary-200);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.dark .cc_div #s-bns #s-rall-bn:disabled,.dark +.cc_div #s-bns #s-sv-bn:disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}.cc_div #s-bns #s-rall-bn,.cc_div #s-bns #s-sv-bn{background-color:var(--theme-color-primary-100);border-radius:.25rem;color:var(--theme-color-primary-600);font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}.dark .cc_div #s-bns #s-rall-bn,.dark .cc_div #s-bns #s-rall-bn:hover,.dark +.cc_div #s-bns #s-sv-bn,.dark +.cc_div #s-bns #s-sv-bn:hover{color:var(--theme-color-secondary-200)}a.cc_div #s-bns #s-rall-bn,a +.cc_div #s-bns #s-sv-bn{display:inline-block}.dark .cc_div #s-bns #s-rall-bn:hover,.dark +.cc_div #s-bns #s-sv-bn:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.documentation-content a.cc_div #s-bns #s-rall-bn:hover,.documentation-content a +.cc_div #s-bns #s-sv-bn:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.documentation-content .page-ref .cc_div #s-bns #s-rall-bn,.documentation-content .page-ref +.cc_div #s-bns #s-sv-bn{border-radius:0}.dark .cc_div #s-bns #s-rall-bn:disabled,.dark +.cc_div #s-bns #s-sv-bn:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.dark .dark .cc_div #s-bns #s-rall-bn:disabled,.dark .dark +.cc_div #s-bns #s-sv-bn:disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-700)}.dark .cc_div #s-bns #s-rall-bn,.dark +.cc_div #s-bns #s-sv-bn{border-radius:.25rem;font-weight:600;line-height:1.25;padding:.75rem 1.25rem;text-align:center;transition:all .1s ease-in}a.dark .cc_div #s-bns #s-rall-bn,a.dark +.cc_div #s-bns #s-sv-bn{display:inline-block}.dark .cc_div #s-bns #s-rall-bn,.dark +.cc_div #s-bns #s-sv-bn{--tw-text-opacity:1;background-color:var(--theme-color-secondary-800);color:rgb(255 255 255/var(--tw-text-opacity))}.dark .cc_div #s-bns #s-rall-bn:hover,.dark +.cc_div #s-bns #s-sv-bn:hover{background-color:var(--theme-color-secondary-900)}.dark .cc_div #s-bns #s-rall-bn a,.dark +.cc_div #s-bns #s-sv-bn a{display:inline-block}.dark .dark .cc_div #s-bns #s-rall-bn:hover,.dark .dark +.cc_div #s-bns #s-sv-bn:hover{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.cc_div #s-bns #s-rall-bn:hover,.cc_div #s-bns #s-sv-bn:hover,.dark .cc_div #s-bns #s-rall-bn:hover,.dark +.cc_div #s-bns #s-sv-bn:hover{--tw-text-opacity:1;background-color:var(--theme-color-primary-700);color:rgb(255 255 255/var(--tw-text-opacity));transition:all .1s ease-in}@media screen and (min-width:689px){.documentation-sidebar .cc_div #s-bns+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.cc_div #s-bns{display:flex;flex-direction:row-reverse;height:auto;padding-bottom:2.5rem}.cc_div #s-bns #s-rall-bn{margin-left:0;margin-right:1rem}.cc_div #s-bns #s-sv-bn{margin-right:auto}}.cc_div #s-bl .c-bl.b-ex{border:2px solid var(--theme-color-primary-100);border-radius:.75rem}.cc_div #s-bl .c-bl,.cc_div #s-bl .c-bl.b-ex{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.cc_div #s-bl .c-bl{border-width:0;padding:0}.cc_div .b-tg .c-tgl:checked:disabled~.c-tg,.cc_div .b-tg .c-tgl~.c-tg{background-color:var(--theme-color-secondary-400)}.cc_div .b-tg .c-tgl:checked~.c-tg{background-color:var(--theme-color-primary-600)}.cc_div #s-bl .b-acc .p,.cc_div #s-bl .c-bl .p{line-height:1.75rem}.cc_div .cloud #c-inr-i{width:80%}.cc_div button.c-bn{font-size:1rem;line-height:1.5rem;line-height:1.25;padding:.75rem 1.25rem}.cc_div div a{border-bottom-width:0}.cc_div #s-inr{border-radius:.75rem}.dark #s-bl .title,.dark #s-bl td:before,.dark #s-cnt .b-bn .b-tl,.dark .cc_div #c-ttl,.dark .cc_div #s-hdr #s-ttl{color:var(--theme-color-secondary-200)}.dark #c-txt,.dark #s-bl table{color:var(--theme-color-secondary-500)}.dark .cc_div #s-bl .c-bl{background-color:var(--theme-color-secondary-900);border-color:var(--theme-color-secondary-800)}.dark #s-bl table tr:hover,.dark #s-cnt .b-bn .b-tl:hover{background-color:var(--theme-color-secondary-800)}.dark #s-bl table tr{border-color:var(--theme-color-secondary-800)}.dark .cc_div .b-tg .c-tgl:checked:disabled~.c-tg,.dark .cc_div .b-tg .c-tgl~.c-tg{background-color:var(--theme-color-secondary-800)}.dark .cc_div .c-tgl:checked~.c-tg{background-color:var(--theme-color-primary-600)}.dark .cc_div .c-tgl:checked:not(:disabled)~.c-tg .on-i:before{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.dark .cc_div .c-tgl:checked:not(:disabled)~.c-tg:after,html{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}html{min-height:100%}.content{line-height:1.5}.table-header{font-size:1.5rem;font-weight:700;line-height:2rem}.paragraph-description{line-height:1.75rem}.modal-backdrop{background-color:rgba(0,0,0,.4);height:100vh;left:0;overflow:hidden;position:fixed;top:0;width:100vw;z-index:10}.bridgechain-items-grid{display:grid;gap:1rem 1rem;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));width:100%}@media (min-width:640px){.bridgechain-items-grid{display:grid;gap:1rem 1rem;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));width:100%}}.create-token--input-grid{display:grid;gap:1rem 1rem;grid-template-columns:repeat(auto-fill,minmax(20rem,1fr))}.contact-form--input-grid{display:grid;gap:1rem 1rem;grid-template-columns:repeat(auto-fill,minmax(18rem,1fr))}@media (min-width:768px){.contact-form--input-grid{grid-template-columns:repeat(auto-fill,minmax(25rem,1fr))}}.collaborator-grid{display:grid;gap:1rem 1rem;grid-template-columns:repeat(auto-fill,minmax(12rem,1fr))}@media (min-width:768px){.collaborator-grid{grid-template-columns:repeat(auto-fill,minmax(15rem,1fr))}}.fade-enter-active,.fade-leave-active{transition:opacity .5s}.fade-enter,.fade-leave-to{opacity:0}.terms-of-service ol{list-style-position:inside;list-style-type:decimal;margin-top:.75rem}.terms-of-service ol ol{margin-left:1rem}.terms-of-service ol li{margin-top:.25rem}.terms-of-service ol.roman{list-style-type:lower-roman}.terms-of-service--heading{font-size:1.125rem;font-weight:600;line-height:1.75rem;margin-top:1rem}.privacy-policy ul{list-style-position:inside;list-style-type:disc;margin-top:.75rem}.privacy-policy ul ul{margin-left:1rem}.privacy-policy ul li{margin-top:.25rem}div.disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:var(--theme-color-secondary-200);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--theme-color-secondary-400);cursor:not-allowed;pointer-events:none}.notification-truncate{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis}#swiper-tiers .swiper-slide{height:auto}.home-header-image{background:linear-gradient(0deg,#fff 50%,#f7fafb 0)}@media (min-width:768px){.home-header-image{background:linear-gradient(0deg,#fff 70%,#f7fafb 0)}}.documentation-sidebar body+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}body{color:var(--theme-color-secondary-700);display:flex;flex-direction:column;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;min-height:100vh}#app{flex-grow:1}.header-1{color:var(--theme-color-secondary-900);font-size:2.25rem;font-weight:700;line-height:2.5rem;line-height:1.25;margin-bottom:.5rem}.header-2{font-size:1.5rem;line-height:2rem}.header-2,.header-3{color:var(--theme-color-secondary-900);font-weight:700;margin-bottom:.25rem}.header-3{font-size:1.25rem;line-height:1.75rem}.header-4{color:var(--theme-color-secondary-900);font-size:1.125rem;font-weight:700;line-height:1.75rem;margin-bottom:.25rem}.welcome-screen{height:100%;max-height:200px;-o-object-fit:contain;object-fit:contain;width:100%}@media (min-width:768px){.welcome-screen{max-height:400px}}.beta-notice{height:100%;max-height:104px;-o-object-fit:contain;object-fit:contain;width:100%}#swiper-tokens,#swiper-tokens .swiper-wrapper{margin:0}#swiper-tokens .swiper-wrapper{padding-bottom:2rem}.table-container table tbody td:first-child{padding-left:0}.table-container table tbody td:last-child{padding-right:0}.documentation-sidebar button.dropdown-entry+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}button.dropdown-entry{--tw-bg-opacity:0;align-items:center;display:flex}a.alert-content>a.focus-visible,button.alert-content>a.focus-visible{border-radius:.25rem}a.alert-content>a:focus-visible,button.alert-content>a:focus-visible{border-radius:.25rem}.alert-content>a{color:var(--theme-color-primary-600);cursor:pointer;font-weight:600;-webkit-text-decoration-line:none;text-decoration-line:none;transition:all .1s ease-in}.simple-markdown a:is(.alert-content>a):hover{text-decoration:none}.alert-content>a.read-only{cursor:not-allowed}.alert-content>a:hover{color:var(--theme-color-primary-700);-webkit-text-decoration-line:underline;text-decoration-line:underline}.alert-content>a.link-no-underline:hover{-webkit-text-decoration-line:none;text-decoration-line:none}.simple-markdown a:is(.alert-content>a.link-no-underline:hover):hover{text-decoration:none}.alert-content>a:active{color:var(--theme-color-primary-400)}.description-block-link:hover .alert-content>a{color:var(--theme-color-primary-700);-webkit-text-decoration-line:underline;text-decoration-line:underline}.documentation-sidebar .dropdown-entry+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.dropdown-entry{align-items:center;display:flex}.dropdown-entry>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.dropdown-entry:hover{background-color:var(--theme-color-primary-100)}.documentation-sidebar .dropdown-entry span+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.dropdown-entry span{align-items:center;display:flex}.dropdown-entry span>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.dropdown-entry.delete-server,.dropdown-entry.delete-server:hover{color:var(--theme-color-danger-400)!important}.dropdown-entry.delete-server:hover{background-color:var(--theme-color-danger-100)!important}.dropdown-entry-disabled{background-color:var(--theme-color-secondary-100);color:var(--theme-color-secondary-500);cursor:pointer;display:block;font-weight:500;padding:1rem 2rem;text-align:left;transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap;width:100%}.table-container table>tbody>tr>td.hoverable-cell:is(.dropdown-entry-disabled)>div.table-cell-content{justify-content:flex-start}.dropdown-entry-disabled{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:var(--theme-color-secondary-900)}.dark .dropdown-entry-disabled{background-color:var(--theme-color-secondary-800);color:var(--theme-color-secondary-200)}.dropdown-entry-disabled:focus{outline:2px solid transparent;outline-offset:2px}.dropdown-entry-disabled:not([disabled]):not(.dropdown-entry-disabled):hover{background-color:var(--theme-color-secondary-100);color:var(--theme-color-secondary-900)}.dark .dropdown-entry-disabled:not([disabled]):not(.dropdown-entry-disabled):hover{background-color:var(--theme-color-secondary-900);color:var(--theme-color-secondary-200)}.dropdown-entry-disabled[disabled]{cursor:not-allowed;opacity:.5}.documentation-sidebar button.dropdown-entry-disabled+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}button.dropdown-entry-disabled{--tw-bg-opacity:0;align-items:center;display:flex}.documentation-sidebar .dropdown-entry-disabled+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.dropdown-entry-disabled{align-items:center;display:flex}.dropdown-entry-disabled>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.dropdown-entry-disabled:hover{background-color:var(--theme-color-primary-100)}.documentation-sidebar .dropdown-entry-disabled span+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.dropdown-entry-disabled span{align-items:center;display:flex}.dropdown-entry-disabled span>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.dropdown-entry-disabled.delete-server,.dropdown-entry-disabled.delete-server:hover{color:var(--theme-color-danger-400)!important}.dropdown-entry-disabled.delete-server:hover{background-color:var(--theme-color-danger-100)!important}.form-radio:checked.radio-checkmark{color:var(--theme-color-primary-500)!important}.form-checkbox:checked{color:var(--theme-color-primary-600)!important}.pagination{list-style:none}.documentation-sidebar .pagination+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.pagination{display:flex;justify-content:center;padding:0}.pagination .page-item .page-link{background-color:#fff;border-bottom-width:1px;border-left-width:1px;border-top-width:1px;color:#2779bd;display:block;padding:.75rem;text-decoration:none}.pagination .page-item .page-link:hover{background-color:#f1f5f8}.pagination .page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.pagination .page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-right-width:1px;border-top-right-radius:.25rem}.pagination .page-item.active .page-link{background-color:#2779bd;border-color:#2779bd;color:#fff}.pagination .page-item.disabled .page-link{background-color:#f1f5f8;color:#8795a1}.theme-deployer{--theme-color-primary-rgb:84,82,206;--theme-color-primary-50:#f5f5ff;--theme-color-primary-100:#e5e5ff;--theme-color-primary-200:#d6d5ff;--theme-color-primary-300:#9c9aff;--theme-color-primary-400:#6e6cef;--theme-color-primary-500:#5b59dc;--theme-color-primary-600:#5452ce;--theme-color-primary-700:#4745b0;--theme-color-primary-800:#363383;--theme-color-primary-900:#212052;--theme-color-secondary-50:#fcfdfd;--theme-color-secondary-100:#f7fafb;--theme-color-secondary-200:#eef3f5;--theme-color-secondary-300:#dbdee5;--theme-color-secondary-400:#c4c8cf;--theme-color-secondary-500:#a5adb9;--theme-color-secondary-600:#7e8a9c;--theme-color-secondary-700:#637282;--theme-color-secondary-800:#3c4249;--theme-color-secondary-900:#212225;--theme-color-danger-50:#fff5f2;--theme-color-danger-100:#ffe0da;--theme-color-danger-200:#feb8ae;--theme-color-danger-300:#ef7c6d;--theme-color-danger-400:#de5846;--theme-color-danger-500:#c9292c;--theme-color-danger-600:#b01e20;--theme-color-danger-700:#881a1b;--theme-color-danger-800:#5b1b1b;--theme-color-danger-900:#391919;--theme-color-warning-50:#fff8eb;--theme-color-warning-100:#ffe6b8;--theme-color-warning-200:#ffd486;--theme-color-warning-300:#ffc359;--theme-color-warning-400:#feb933;--theme-color-warning-500:#ffae10;--theme-color-warning-600:#fc9f0f;--theme-color-warning-700:#f88e0d;--theme-color-warning-800:#f27c0b;--theme-color-warning-900:#ec5c08;--theme-color-success-50:#f6fdf8;--theme-color-success-100:#edf7f0;--theme-color-success-200:#e2f0e6;--theme-color-success-300:#b0dbbc;--theme-color-success-400:#8cc69d;--theme-color-success-500:#42b263;--theme-color-success-600:#289548;--theme-color-success-700:#307845;--theme-color-success-800:#2b4f35;--theme-color-success-900:#26372b;--theme-color-info-50:#f5faff;--theme-color-info-100:#e5f0f8;--theme-color-info-200:#bad6f0;--theme-color-info-300:#99c7ee;--theme-color-info-400:#77b9f3;--theme-color-info-500:#3e9dff;--theme-color-info-600:#007dff;--theme-color-info-700:#075af2;--theme-color-info-800:#0b4dc7;--theme-color-info-900:#173e85}:root{--theme-color-primary-rgb:84,82,206;--theme-color-primary-50:#f5f5ff;--theme-color-primary-100:#e5e5ff;--theme-color-primary-200:#d6d5ff;--theme-color-primary-300:#9c9aff;--theme-color-primary-400:#6e6cef;--theme-color-primary-500:#5b59dc;--theme-color-primary-600:#5452ce;--theme-color-primary-700:#4745b0;--theme-color-primary-800:#363383;--theme-color-primary-900:#212052;--theme-color-secondary-50:#fcfdfd;--theme-color-secondary-100:#f7fafb;--theme-color-secondary-200:#eef3f5;--theme-color-secondary-300:#dbdee5;--theme-color-secondary-400:#c4c8cf;--theme-color-secondary-500:#a5adb9;--theme-color-secondary-600:#7e8a9c;--theme-color-secondary-700:#637282;--theme-color-secondary-800:#3c4249;--theme-color-secondary-900:#212225;--theme-color-danger-50:#fff5f2;--theme-color-danger-100:#ffe0da;--theme-color-danger-200:#feb8ae;--theme-color-danger-300:#ef7c6d;--theme-color-danger-400:#de5846;--theme-color-danger-500:#c9292c;--theme-color-danger-600:#b01e20;--theme-color-danger-700:#881a1b;--theme-color-danger-800:#5b1b1b;--theme-color-danger-900:#391919;--theme-color-warning-50:#fff8eb;--theme-color-warning-100:#ffe6b8;--theme-color-warning-200:#ffd486;--theme-color-warning-300:#ffc359;--theme-color-warning-400:#feb933;--theme-color-warning-500:#ffae10;--theme-color-warning-600:#fc9f0f;--theme-color-warning-700:#f88e0d;--theme-color-warning-800:#f27c0b;--theme-color-warning-900:#ec5c08;--theme-color-success-50:#f6fdf8;--theme-color-success-100:#edf7f0;--theme-color-success-200:#e2f0e6;--theme-color-success-300:#b0dbbc;--theme-color-success-400:#8cc69d;--theme-color-success-500:#42b263;--theme-color-success-600:#289548;--theme-color-success-700:#307845;--theme-color-success-800:#2b4f35;--theme-color-success-900:#26372b;--theme-color-info-50:#f5faff;--theme-color-info-100:#e5f0f8;--theme-color-info-200:#bad6f0;--theme-color-info-300:#99c7ee;--theme-color-info-400:#77b9f3;--theme-color-info-500:#3e9dff;--theme-color-info-600:#007dff;--theme-color-info-700:#075af2;--theme-color-info-800:#0b4dc7;--theme-color-info-900:#173e85}[x-cloak]{display:none!important}.last\:border-b-0:last-child{border-bottom-width:0}.last\:pb-4:last-child{padding-bottom:1rem}.focus-within\:border-theme-primary-500:focus-within{border-color:var(--theme-color-primary-500)}.hover\:border-theme-primary-600:hover{border-color:var(--theme-color-primary-600)}.hover\:border-theme-primary-700:hover{border-color:var(--theme-color-primary-700)}.hover\:border-transparent:hover{border-color:transparent}.hover\:border-theme-secondary-300:hover{border-color:var(--theme-color-secondary-300)}.hover\:border-theme-primary-200:hover{border-color:var(--theme-color-primary-200)}.hover\:border-theme-primary-400:hover{border-color:var(--theme-color-primary-400)}.hover\:bg-theme-primary-700:hover{background-color:var(--theme-color-primary-700)}.hover\:bg-theme-secondary-100:hover{background-color:var(--theme-color-secondary-100)}.hover\:bg-theme-secondary-300:hover{background-color:var(--theme-color-secondary-300)}.hover\:bg-theme-success-50:hover{background-color:var(--theme-color-success-50)}.hover\:bg-theme-danger-400:hover{background-color:var(--theme-color-danger-400)}.hover\:bg-theme-primary-100:hover{background-color:var(--theme-color-primary-100)}.hover\:bg-theme-primary-400:hover{background-color:var(--theme-color-primary-400)}.hover\:text-theme-primary-500:hover{color:var(--theme-color-primary-500)}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.hover\:text-theme-primary-400:hover{color:var(--theme-color-primary-400)}.hover\:text-theme-secondary-200:hover{color:var(--theme-color-secondary-200)}.hover\:text-theme-primary-600:hover{color:var(--theme-color-primary-600)}.hover\:text-theme-primary-700:hover{color:var(--theme-color-primary-700)}.hover\:text-theme-secondary-800:hover{color:var(--theme-color-secondary-800)}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.hover\:no-underline:hover{-webkit-text-decoration-line:none;text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.hover\:shadow-lg:hover,.hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.hover\:outline-none:hover{outline:2px solid transparent;outline-offset:2px}.hover\:size-increase:hover{transform:scale(1.02)}.focus\:border-theme-danger-300:focus{border-color:var(--theme-color-danger-300)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-theme-danger-300:focus{--tw-ring-color:var(--theme-color-danger-300)}.focus-visible\:-mt-px.focus-visible{margin-top:-1px}.focus-visible\:-mt-px:focus-visible{margin-top:-1px}.focus-visible\:rounded.focus-visible{border-radius:.25rem}.focus-visible\:rounded:focus-visible{border-radius:.25rem}.focus-visible\:border-b-0.focus-visible{border-bottom-width:0}.focus-visible\:border-b-0:focus-visible{border-bottom-width:0}.focus-visible\:border-transparent.focus-visible{border-color:transparent}.focus-visible\:border-transparent:focus-visible{border-color:transparent}.focus-visible\:pt-0.focus-visible{padding-top:0}.focus-visible\:pt-0:focus-visible{padding-top:0}.focus-visible\:ring-2.focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-inset.focus-visible{--tw-ring-inset:inset}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.focus-visible\:ring-theme-primary-500.focus-visible{--tw-ring-color:var(--theme-color-primary-500)}.focus-visible\:ring-theme-primary-500:focus-visible{--tw-ring-color:var(--theme-color-primary-500)}.group:hover .group-hover\:border-theme-primary-400{border-color:var(--theme-color-primary-400)}.group:hover .group-hover\:bg-transparent{background-color:transparent}.group:hover .group-hover\:bg-theme-primary-100{background-color:var(--theme-color-primary-100)}.group:hover .group-hover\:bg-theme-success-50{background-color:var(--theme-color-success-50)}.group:hover .group-hover\:text-theme-primary-600{color:var(--theme-color-primary-600)}.group:hover .group-hover\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.group:hover .group-hover\:text-theme-primary-700{color:var(--theme-color-primary-700)}.group:hover .group-hover\:text-theme-primary-500{color:var(--theme-color-primary-500)}.inverted .inverted\:border-theme-secondary-300{border-color:var(--theme-color-secondary-300)}.inverted .inverted\:border-transparent{border-color:transparent}.inverted .inverted\:border-theme-primary-600{border-color:var(--theme-color-primary-600)}.inverted .inverted\:bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.inverted .inverted\:text-theme-secondary-900{color:var(--theme-color-secondary-900)}.inverted .inverted\:text-theme-secondary-700{color:var(--theme-color-secondary-700)}.inverted .inverted\:shadow-header-smooth{--tw-shadow: 0px 2px 10px 0px rgba(192,200,207,.22);--tw-shadow-colored:0px 2px 10px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.inverted .inverted\:hover\:border-theme-primary-600:hover{border-color:var(--theme-color-primary-600)}.inverted .inverted\:hover\:border-theme-secondary-300:hover{border-color:var(--theme-color-secondary-300)}.inverted .inverted\:hover\:bg-theme-primary-100:hover{background-color:var(--theme-color-primary-100)}.inverted .inverted\:hover\:text-theme-primary-700:hover{color:var(--theme-color-primary-700)}.inverted .inverted\:hover\:text-theme-secondary-900:hover{color:var(--theme-color-secondary-900)}.dark .dark\:block{display:block}.dark .dark\:hidden{display:none}.dark .dark\:border-theme-secondary-800,.dark .dark\:divide-theme-secondary-800>:not([hidden])~:not([hidden]){border-color:var(--theme-color-secondary-800)}.dark .dark\:border-theme-secondary-600{border-color:var(--theme-color-secondary-600)}.dark .dark\:border-theme-secondary-700{border-color:var(--theme-color-secondary-700)}.dark .dark\:bg-theme-secondary-800{background-color:var(--theme-color-secondary-800)}.dark .dark\:bg-black{--tw-bg-opacity:1;background-color:rgb(18 18 19/var(--tw-bg-opacity))}.dark .dark\:bg-theme-secondary-900{background-color:var(--theme-color-secondary-900)}.dark .dark\:bg-theme-danger-400{background-color:var(--theme-color-danger-400)}.dark .dark\:bg-theme-success-600{background-color:var(--theme-color-success-600)}.dark .dark\:bg-theme-warning-600{background-color:var(--theme-color-warning-600)}.dark .dark\:bg-theme-secondary-700{background-color:var(--theme-color-secondary-700)}.dark .dark\:bg-theme-success-900{background-color:var(--theme-color-success-900)}.dark .dark\:bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.dark .dark\:bg-opacity-95{--tw-bg-opacity:0.95}.dark .dark\:text-theme-secondary-200{color:var(--theme-color-secondary-200)}.dark .dark\:text-theme-secondary-700{color:var(--theme-color-secondary-700)}.dark .dark\:text-theme-secondary-500{color:var(--theme-color-secondary-500)}.dark .dark\:text-theme-secondary-600{color:var(--theme-color-secondary-600)}.dark .dark\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark .dark\:text-theme-secondary-300{color:var(--theme-color-secondary-300)}.dark .dark\:text-theme-secondary-400{color:var(--theme-color-secondary-400)}.dark .dark\:opacity-50{opacity:.5}.dark .dark\:shadow-lg-dark{--tw-shadow:0 0px 25px -3px rgba(18,18,19,.7),0 4px 15px 0px rgba(18,18,19,.7);--tw-shadow-colored:0 0px 25px -3px var(--tw-shadow-color),0 4px 15px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dark .dark\:hover\:bg-theme-success-900:hover{background-color:var(--theme-color-success-900)}.dark .dark\:hover\:bg-theme-secondary-600:hover{background-color:var(--theme-color-secondary-600)}.dark .dark\:hover\:bg-theme-secondary-800:hover{background-color:var(--theme-color-secondary-800)}.dark .dark\:hover\:text-theme-secondary-800:hover{color:var(--theme-color-secondary-800)}.dark .dark\:hover\:text-theme-primary-600:hover{color:var(--theme-color-primary-600)}.dark .dark\:hover\:text-theme-secondary-400:hover{color:var(--theme-color-secondary-400)}.dark .dark\:hover\:text-theme-primary-700:hover{color:var(--theme-color-primary-700)}.dark .dark\:hover\:text-theme-secondary-100:hover{color:var(--theme-color-secondary-100)}.dark .group:hover .dark\:group-hover\:bg-theme-secondary-800{background-color:var(--theme-color-secondary-800)}.dark .group:hover .dark\:group-hover\:bg-theme-success-900{background-color:var(--theme-color-success-900)}.dark .group:hover .dark\:group-hover\:text-theme-secondary-100{color:var(--theme-color-secondary-100)}@media (min-width:640px){.sm\:static{position:static}.sm\:absolute{position:absolute}.sm\:relative{position:relative}.sm\:left-auto{left:auto}.sm\:top-0{top:0}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.sm\:mb-0{margin-bottom:0}.sm\:mt-5{margin-top:1.25rem}.sm\:mt-4{margin-top:1rem}.sm\:mt-0{margin-top:0}.sm\:mr-2{margin-right:.5rem}.sm\:mt-8{margin-top:2rem}.sm\:mr-8{margin-right:2rem}.sm\:-mt-1\.5{margin-top:-.375rem}.sm\:-mr-1\.5{margin-right:-.375rem}.sm\:-mt-1{margin-top:-.25rem}.sm\:-mr-1{margin-right:-.25rem}.sm\:mr-12{margin-right:3rem}.sm\:ml-6{margin-left:1.5rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:table-cell{display:table-cell}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:w-auto{width:auto}.sm\:w-1\/3{width:33.333333%}.sm\:w-80{width:20rem}.sm\:w-136{width:34rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-none{max-width:none}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-full{max-width:100%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:flex-col{flex-direction:column}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:1rem}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.sm\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.sm\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.sm\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.sm\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.sm\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.sm\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.sm\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.sm\:divide-theme-secondary-200>:not([hidden])~:not([hidden]){border-color:var(--theme-color-secondary-200)}.sm\:rounded-xl{border-radius:.75rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:border-2{border-width:2px}.sm\:border-r{border-right-width:1px}.sm\:border-t-0{border-top-width:0}.sm\:p-10{padding:2.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:pr-6{padding-right:1.5rem}.sm\:pl-6{padding-left:1.5rem}.sm\:pt-8{padding-top:2rem}.sm\:pl-5{padding-left:1.25rem}.sm\:pl-8{padding-left:2rem}.sm\:pt-0{padding-top:0}.sm\:pl-4{padding-left:1rem}.sm\:text-center{text-align:center}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.documentation-sidebar .sm\:flex+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}}@media (min-width:768px){.md\:absolute{position:absolute}.md\:relative{position:relative}.md\:col-span-2{grid-column:span 2/span 2}.md\:m-auto{margin:auto}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mx-0{margin-left:0;margin-right:0}.md\:mx-8{margin-left:2rem;margin-right:2rem}.md\:mb-0{margin-bottom:0}.md\:mt-0{margin-top:0}.md\:mb-4{margin-bottom:1rem}.md\:ml-4{margin-left:1rem}.md\:mt-3{margin-top:.75rem}.md\:mt-8{margin-top:2rem}.md\:mt-4{margin-top:1rem}.md\:ml-16{margin-left:4rem}.md\:mr-0{margin-right:0}.md\:mt-2{margin-top:.5rem}.md\:mr-12{margin-right:3rem}.md\:ml-12{margin-left:3rem}.md\:ml-6{margin-left:1.5rem}.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:table-cell{display:table-cell}.md\:hidden{display:none}.md\:h-11{height:2.75rem}.md\:h-4{height:1rem}.md\:h-3{height:.75rem}.md\:h-13{height:3.25rem}.md\:w-120{width:30rem}.md\:w-1\/5{width:20%}.md\:w-4\/5{width:80%}.md\:w-56{width:14rem}.md\:w-full{width:100%}.md\:w-11{width:2.75rem}.md\:w-auto{width:auto}.md\:w-4{width:1rem}.md\:w-2{width:.5rem}.md\:w-1\/4{width:25%}.md\:w-13{width:3.25rem}.md\:w-1\/2{width:50%}.md\:w-3\/4{width:75%}.md\:max-w-xl{max-width:36rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-row-reverse{flex-direction:row-reverse}.md\:flex-col-reverse{flex-direction:column-reverse}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:justify-between{justify-content:space-between}.md\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.md\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.md\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.md\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.md\:rounded-xl{border-radius:.75rem}.md\:border-2{border-width:2px}.md\:border-0{border-width:0}.md\:border-b-0{border-bottom-width:0}.md\:border-r{border-right-width:1px}.md\:border-theme-primary-100{border-color:var(--theme-color-primary-100)}.md\:bg-theme-primary-100{background-color:var(--theme-color-primary-100)}.md\:bg-theme-primary-600{background-color:var(--theme-color-primary-600)}.md\:p-0{padding:0}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-4{padding-bottom:1rem;padding-top:1rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:py-10{padding-bottom:2.5rem;padding-top:2.5rem}.md\:px-5{padding-left:1.25rem;padding-right:1.25rem}.md\:px-0{padding-left:0;padding-right:0}.md\:py-12{padding-bottom:3rem;padding-top:3rem}.md\:py-2{padding-bottom:.5rem;padding-top:.5rem}.md\:py-8{padding-bottom:2rem;padding-top:2rem}.md\:pt-3{padding-top:.75rem}.md\:pb-0{padding-bottom:0}.md\:pr-8{padding-right:2rem}.md\:pl-10{padding-left:2.5rem}.md\:pr-16{padding-right:4rem}.md\:pt-8{padding-top:2rem}.md\:pt-12{padding-top:3rem}.md\:text-right{text-align:right}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-theme-secondary-700{color:var(--theme-color-secondary-700)}.md\:text-theme-primary-600{color:var(--theme-color-primary-600)}.md\:text-theme-secondary-100{color:var(--theme-color-secondary-100)}.documentation-sidebar .md\:flex+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}}@media (min-width:1024px){.lg\:my-1{margin-bottom:.25rem;margin-top:.25rem}.lg\:mx-0{margin-right:0}.lg\:ml-0,.lg\:mx-0{margin-left:0}.lg\:mt-0{margin-top:0}.lg\:ml-2{margin-left:.5rem}.lg\:mr-2{margin-right:.5rem}.lg\:mb-px{margin-bottom:1px}.lg\:ml-5{margin-left:1.25rem}.lg\:mr-0{margin-right:0}.lg\:ml-6{margin-left:1.5rem}.lg\:mt-8{margin-top:2rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:table-cell{display:table-cell}.lg\:hidden{display:none}.lg\:h-12{height:3rem}.lg\:h-5{height:1.25rem}.lg\:h-11{height:2.75rem}.lg\:h-auto{height:auto}.lg\:w-3\/4{width:75%}.lg\:w-14{width:3.5rem}.lg\:w-5{width:1.25rem}.lg\:w-58{width:14.5rem}.lg\:w-1\/5{width:20%}.lg\:w-1\/2{width:50%}.lg\:w-auto{width:auto}.lg\:w-3\/5{width:60%}.lg\:min-w-0{min-width:0}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-none{max-width:none}.lg\:flex-1{flex:1 1 0%}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:justify-start{justify-content:flex-start}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.lg\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.lg\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(3rem*var(--tw-space-x-reverse))}.lg\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.lg\:rounded-lg{border-radius:.5rem}.lg\:rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.lg\:border-r{border-right-width:1px}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:py-3{padding-bottom:.75rem;padding-top:.75rem}.lg\:px-0{padding-left:0;padding-right:0}.lg\:py-1{padding-bottom:.25rem;padding-top:.25rem}.lg\:pt-0{padding-top:0}.lg\:pr-5{padding-right:1.25rem}.lg\:pl-6{padding-left:1.5rem}.lg\:pt-4{padding-top:1rem}.lg\:pr-6{padding-right:1.5rem}.lg\:pl-10{padding-left:2.5rem}.lg\:pt-8{padding-top:2rem}.documentation-sidebar .lg\:flex+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}.lg\:no-wrap-span-children>span{white-space:nowrap}}@media (min-width:1280px){.xl\:mx-16{margin-left:4rem;margin-right:4rem}.xl\:mt-0{margin-top:0}.xl\:ml-6{margin-left:1.5rem}.xl\:block{display:block}.xl\:flex{display:flex}.xl\:table-cell{display:table-cell}.xl\:hidden{display:none}.xl\:w-1\/2{width:50%}.xl\:w-72{width:18rem}.xl\:w-36{width:9rem}.xl\:w-40{width:10rem}.xl\:w-48{width:12rem}.xl\:w-12{width:3rem}.xl\:w-1\/6{width:16.666667%}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.xl\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(0px*var(--tw-divide-y-reverse));border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)))}.xl\:px-0{padding-left:0;padding-right:0}.xl\:pb-3{padding-bottom:.75rem}.documentation-sidebar .xl\:flex+h2:not(.documentation-sidebar h2:first-of-type){margin-top:1rem}} diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..64cc8a5fb3f6b8fd249d202de5dcf701bbb0cc59 GIT binary patch literal 795 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZRM{@Ck7Z2|7nS3JyFM6mYJn;CfNv^{9vop~2^3 zqAr|0^YQH2k1^2~qN6S(CtaE~^U=i%pDtYZG<(*gl%&f!Syu!7&lcog+p+z1Z_mBH zp8JLQ*RnIOmY3Z~OT8QscD}#w{<^g<`g-qA=(`^oem*_*a#`t(pn$WL6*nu&Zp6o4 z3=chDTzI{x;95f5#ftJ9X(^XiuX>)9aV0tN(t-VNckgoWeE-u#se*XCT|Ns9VKmNA1+}XeH?aiBC_U(Ps(tL+u`If)H zaNsKm@(Zqh|Do>nyWjs_y(xY9tK#b1=j}il#w2fd7vF{qg;XGiy~NYkmHinD8haU{>bVOXe0< z7WSSj!Yr)d(qM8pg;{xXh{EX`S56!`b42C{`{@Rc1zvg#8dLcmYboW*1C8G9>Eak7 zaXGaAs?Z?^9#?VgeUTa5uHu?;YaA{; zh8dUt3aW^x*&i%A;J%2dz|fgNo_&(XvP&!){JTzE$kEdm`*c)C_hr)*?W?miJioea zzN$8Bg7saw&|l20eD2DT{XObh^UgivUZWRY#d5f6^WC@n$KR^)9*a!yf8Kp8G|9Ko zapzt6{^#C}`N1=VEBwr6SFPD!G4cF)mVE~E9!SS&Nby}P__qM)1=SMQh?11Vl2ohY zqEsNoU}Ruqq-$WJYhV^)XkcYxVr5{cZD3$!U?5fh$qz+CZhlH;S|x4`*-BoYfEpM) MUHx3vIVCg!03x|t%K!iX literal 0 HcmV?d00001 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fcaa72001e1131d197059fa3d188bf911d28b62e GIT binary patch literal 1349 zcmb_aeNYm182%xClwD0t&uY7k`O#3!&{5ZM-7Xu>&lC_4vkV1IG!qq5EEgcw(%Q<5 zSlLNNL0PNSQs?}rv{DEJLJpn*I5`ZZR0B8XKo{XwS z+)e=O?6J{=Py$}@f0X<`j>O><2a;5jBo#4EaqsTL@AoDX;=AxzIs3={xjF0noR!1w z-?vw(Qdw43R=U*|$^mr>MV)*=O(J$Nb9>38t{UOk^76{`^rGn6tNgrP5~1s0YIk9Q z&Sd&9HThv?X7NbAuBcF-M(aLa+{eh)?jS!B@GDrs8YU(d1Q$m#(lzIP8M-PQOHb3_v5KtB zp3`N6Tuy&|-Bd%piC1Fi?zUuSX{)b{-nuz{Q(`<_KG@kY+wpw1{M2CWt?`^}t@wsf zA~xb;<*Y(|(mvHumj1fv)rHEJnRLy$vqKql&7IrhxjDUB?Oa}N@8H1O9?cv+R?f`p z)%MIW4r}9yU2RWZ_vzdZeA^mX?{qBRai){!#0U#j-RzyZBe5=_3E-gZq<4 z|7f*53LO}ZgkW0DZ{Iu) zgK)m~XWDilDN$jVt=<}#tBp7@Bld(k8SNdN10dBU`Er{STSOo;@yP`+Ms9W*{ZJ~5 z$zr6!=nN(mfWoR#X#hOJhzC&bHG$MM>%G@Uop*<>hhf;LHX79X0Rbk{X*$|pw13g= zBx8pQBLe~a!n#p^udJ_ZpPxryLI^u#R0@TbLV5%dB#<|5(CIwPU|o!3phFY;GRLXa zF3IsbtMh`&1MXjAaZtL${rwOlL}AUX8{GXIv_PZOsI@9kt09Jv0BU2jpJ~$c`3CNm zpkNXPPf5veBvB40)9J|$d|Z892ps#zL+I)Za$=t;9lZn13BWOr;CKinBOhAk*LZYC zQ4wp2ytoLtjd3MkC?_R^Qpx za8-1FSKDo8_h8?i2w#|Y<_otBXp~Efq&6Fztp4E`^?Z<^$Dr=xvsX#p{j3Nqt#Et# z`pe?-B+oMyZlx{DtHUAJg|5gP^_bt|IPs*(lo(wdl&77J$TMcZ!uXMIb{4xMTkW=O z_sI7YN(8OSSl4Zh9-eaY>9f63EfEuoEQ{g?miQ+$9V>MX*#ET{zV^Mk;ew1WPkM-s zhK5yi!*S`^@o?2HH#b<-w8I<3FxBPBU3Pg0*}l3-vZ17bC#poPgLxyq`3(46s*|QW z?RBxG#g`dMX3~dGzRnAZVLBrhn|If literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..332556dcb644184eca4b66daebdaad63ac7d3be8 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/public/fonts/FiraMono-Bold.otf b/public/fonts/FiraMono-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..540b042273cf48bda7635c926cc7912e0ef66388 GIT binary patch literal 87644 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 literal 0 HcmV?d00001 diff --git a/public/fonts/FiraMono-Regular.otf b/public/fonts/FiraMono-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..d871626befe308d2c61b32c74e9929d3d1cf1ef2 GIT binary patch literal 84600 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

x{(lzbRgb#x0+X{? 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 bqnt9KfN#T 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 MCp^&eaN>;p2Q9YAwg3PC literal 0 HcmV?d00001 diff --git a/public/images/ark-logo.svg b/public/images/ark-logo.svg new file mode 100644 index 0000000..51ca5ca --- /dev/null +++ b/public/images/ark-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/auth/verify-email.svg b/public/images/auth/verify-email.svg new file mode 100644 index 0000000..9767dbc --- /dev/null +++ b/public/images/auth/verify-email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/bridgechain.svg b/public/images/bridgechain.svg new file mode 100644 index 0000000..9c8a97e --- /dev/null +++ b/public/images/bridgechain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/defaults/my-team.svg b/public/images/defaults/my-team.svg new file mode 100644 index 0000000..265dd57 --- /dev/null +++ b/public/images/defaults/my-team.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/defaults/no-notifications-navbar.svg b/public/images/defaults/no-notifications-navbar.svg new file mode 100644 index 0000000..8fab875 --- /dev/null +++ b/public/images/defaults/no-notifications-navbar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/defaults/no-notifications-page.svg b/public/images/defaults/no-notifications-page.svg new file mode 100644 index 0000000..98274fc --- /dev/null +++ b/public/images/defaults/no-notifications-page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/defaults/no-notifications.svg b/public/images/defaults/no-notifications.svg new file mode 100644 index 0000000..8fab875 --- /dev/null +++ b/public/images/defaults/no-notifications.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/defaults/pending-invitation.svg b/public/images/defaults/pending-invitation.svg new file mode 100644 index 0000000..49e2558 --- /dev/null +++ b/public/images/defaults/pending-invitation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/defaults/user.svg b/public/images/defaults/user.svg new file mode 100644 index 0000000..0f8b92b --- /dev/null +++ b/public/images/defaults/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/home/basic.svg b/public/images/home/basic.svg new file mode 100644 index 0000000..301e7f1 --- /dev/null +++ b/public/images/home/basic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/home/customize.png b/public/images/home/customize.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e8d35442c99dfcefa929103b3bf39708c015d3 GIT binary patch literal 36083 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 Qp`reyB^1OfM2$ZFe`FR={Qv*} literal 0 HcmV?d00001 diff --git a/public/images/home/deploy.png b/public/images/home/deploy.png new file mode 100644 index 0000000000000000000000000000000000000000..37ceb8d442b6fadd67b2c06c6d296196a9d17f1f GIT binary patch literal 29656 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뾫M^yE3DL(=bEY@!m>+8mdGaOo&0|EstC4^dskzHz*>N92ynzorIwM-4;c2SKH{kW^hXr` z`RO}vdG`2K5NTk&S~h>c6Trc7=v4M;*L~4fR@`#$En*(nU!3wIu=@>dP&sD(s52+toiB)%>YMWpwxA5R<_`L`q@zHqq zA@H5Z-2zpvs%TDW-;LcI^>yJ{Di-irwn;u$myZ$=9#(f-*^O_G202WzltuN& zow@@bb3f6++`NsWCh2#OSdpb6vB;!lA%6Y&Q(ViAR}V#Pb1z_E;vVxho%%t)l07u0 zn_oT;8wGP#yMOuZ=YjyiJ$a8()tSk_&H~!+7A|-OD34$mX`Ug zq$U7gk@vCmqEET^WbY8qqXnva02w-yM%%PJ;QUF;OMw}NZ^G{LFApQ0T`V!H-0NH` z;CZq!(ePs7sM`fs_6c;DC} CfnH4j literal 0 HcmV?d00001 diff --git a/public/images/home/enterprise.svg b/public/images/home/enterprise.svg new file mode 100644 index 0000000..5633ab7 --- /dev/null +++ b/public/images/home/enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/home/header.png b/public/images/home/header.png new file mode 100644 index 0000000000000000000000000000000000000000..36fa7addd2a288cc39b816b0c5c04df62e9b6f35 GIT binary patch literal 29674 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 FV1jv-({%s< literal 0 HcmV?d00001 diff --git a/public/images/home/premium.svg b/public/images/home/premium.svg new file mode 100644 index 0000000..f2b7067 --- /dev/null +++ b/public/images/home/premium.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/installation_complete.svg b/public/images/installation_complete.svg new file mode 100644 index 0000000..1a6d70d --- /dev/null +++ b/public/images/installation_complete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/installation_failed.svg b/public/images/installation_failed.svg new file mode 100644 index 0000000..4693abf --- /dev/null +++ b/public/images/installation_failed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/logo.svg b/public/images/logo.svg new file mode 100644 index 0000000..1f8038c --- /dev/null +++ b/public/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/mail/confirm.png b/public/images/mail/confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..2d13676addf10cde035b04ee3a3e9b4d38751187 GIT binary patch literal 8007 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 JPDHLkV1iuIDP8~o literal 0 HcmV?d00001 diff --git a/public/images/mail/github.png b/public/images/mail/github.png new file mode 100644 index 0000000000000000000000000000000000000000..095d7cef2e5c56f25d606a2f2cc00a65fa10fca4 GIT binary patch literal 526 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 literal 0 HcmV?d00001 diff --git a/public/images/mail/server.png b/public/images/mail/server.png new file mode 100644 index 0000000000000000000000000000000000000000..94574084dc3d51fc23d56cae1791d652dc6e7a1b GIT binary patch literal 10555 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 literal 0 HcmV?d00001 diff --git a/public/images/mail/twitter.png b/public/images/mail/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..c641abd85224207b4de68383feb83a1f7b60e514 GIT binary patch literal 395 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

b8no~&$qJ=kJ?Y`=^s+#&QW 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 LOir{GWDxW}5V+2U literal 0 HcmV?d00001 diff --git a/public/images/metadata.png b/public/images/metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..460ac7e6cf2eb1deb60c25aed8ae4a7a6ba506d0 GIT binary patch literal 69174 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

tq+4 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 \ No newline at end of file diff --git a/public/images/modal/email-change-confirm.svg b/public/images/modal/email-change-confirm.svg new file mode 100644 index 0000000..5b64079 --- /dev/null +++ b/public/images/modal/email-change-confirm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/modal/email-change.svg b/public/images/modal/email-change.svg new file mode 100644 index 0000000..aafb925 --- /dev/null +++ b/public/images/modal/email-change.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/modal/expired-link.svg b/public/images/modal/expired-link.svg new file mode 100644 index 0000000..4715d62 --- /dev/null +++ b/public/images/modal/expired-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/modal/information.svg b/public/images/modal/information.svg new file mode 100644 index 0000000..93cd26b --- /dev/null +++ b/public/images/modal/information.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/modal/invalid-link.svg b/public/images/modal/invalid-link.svg new file mode 100644 index 0000000..dc5aa28 --- /dev/null +++ b/public/images/modal/invalid-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/modal/success.svg b/public/images/modal/success.svg new file mode 100644 index 0000000..a688d04 --- /dev/null +++ b/public/images/modal/success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/modal/warning.svg b/public/images/modal/warning.svg new file mode 100644 index 0000000..7f93b0c --- /dev/null +++ b/public/images/modal/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/onboarding-footer.svg b/public/images/onboarding-footer.svg new file mode 100644 index 0000000..c56c650 --- /dev/null +++ b/public/images/onboarding-footer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/onboarding.svg b/public/images/onboarding.svg new file mode 100644 index 0000000..eddb5c6 --- /dev/null +++ b/public/images/onboarding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server-providers/aws.svg b/public/images/server-providers/aws.svg new file mode 100644 index 0000000..cfb0ad7 --- /dev/null +++ b/public/images/server-providers/aws.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server-providers/digitalocean.svg b/public/images/server-providers/digitalocean.svg new file mode 100644 index 0000000..0a6d95e --- /dev/null +++ b/public/images/server-providers/digitalocean.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server-providers/hetnzer.svg b/public/images/server-providers/hetnzer.svg new file mode 100644 index 0000000..dbdb129 --- /dev/null +++ b/public/images/server-providers/hetnzer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server-providers/hetzner.svg b/public/images/server-providers/hetzner.svg new file mode 100644 index 0000000..dbdb129 --- /dev/null +++ b/public/images/server-providers/hetzner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server-providers/linode.svg b/public/images/server-providers/linode.svg new file mode 100644 index 0000000..dbb9c14 --- /dev/null +++ b/public/images/server-providers/linode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server-providers/vultr.svg b/public/images/server-providers/vultr.svg new file mode 100644 index 0000000..f4037f7 --- /dev/null +++ b/public/images/server-providers/vultr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server/block-explorer.svg b/public/images/server/block-explorer.svg new file mode 100644 index 0000000..3c72fde --- /dev/null +++ b/public/images/server/block-explorer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/server/github.svg b/public/images/server/github.svg new file mode 100644 index 0000000..24d0ac0 --- /dev/null +++ b/public/images/server/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/status.svg b/public/images/status.svg new file mode 100644 index 0000000..8be3760 --- /dev/null +++ b/public/images/status.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/support.svg b/public/images/support.svg new file mode 100644 index 0000000..e864935 --- /dev/null +++ b/public/images/support.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/tokens.svg b/public/images/tokens.svg new file mode 100644 index 0000000..3f7d0fe --- /dev/null +++ b/public/images/tokens.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/vendor/ark/article/placeholder-banner.png b/public/images/vendor/ark/article/placeholder-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d179fab5cfd0477807ca986541d07f8daf24fe GIT binary patch literal 37323 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 literal 0 HcmV?d00001 diff --git a/public/images/vendor/ark/search/empty-dark.svg b/public/images/vendor/ark/search/empty-dark.svg new file mode 100644 index 0000000..642f230 --- /dev/null +++ b/public/images/vendor/ark/search/empty-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/vendor/ark/search/empty.svg b/public/images/vendor/ark/search/empty.svg new file mode 100644 index 0000000..c4cad62 --- /dev/null +++ b/public/images/vendor/ark/search/empty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/verified-email.svg b/public/images/verified-email.svg new file mode 100644 index 0000000..9809c5f --- /dev/null +++ b/public/images/verified-email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/verify-email.svg b/public/images/verify-email.svg new file mode 100644 index 0000000..782c026 --- /dev/null +++ b/public/images/verify-email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/welcome/intro.svg b/public/images/welcome/intro.svg new file mode 100644 index 0000000..be90a50 --- /dev/null +++ b/public/images/welcome/intro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/welcome/slide0.svg b/public/images/welcome/slide0.svg new file mode 100644 index 0000000..f8f610a --- /dev/null +++ b/public/images/welcome/slide0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/welcome/slide1.svg b/public/images/welcome/slide1.svg new file mode 100644 index 0000000..1f43c74 --- /dev/null +++ b/public/images/welcome/slide1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/welcome/slide2.svg b/public/images/welcome/slide2.svg new file mode 100644 index 0000000..3c1919a --- /dev/null +++ b/public/images/welcome/slide2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/welcome/slide3.svg b/public/images/welcome/slide3.svg new file mode 100644 index 0000000..8dab300 --- /dev/null +++ b/public/images/welcome/slide3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/wizard/bitbucket.svg b/public/images/wizard/bitbucket.svg new file mode 100644 index 0000000..872ee28 --- /dev/null +++ b/public/images/wizard/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/wizard/github.svg b/public/images/wizard/github.svg new file mode 100644 index 0000000..bfbe951 --- /dev/null +++ b/public/images/wizard/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/wizard/gitlab.svg b/public/images/wizard/gitlab.svg new file mode 100644 index 0000000..5758971 --- /dev/null +++ b/public/images/wizard/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..2b5641b --- /dev/null +++ b/public/index.php @@ -0,0 +1,58 @@ + + */ +define('LARAVEL_START', microtime(true)); + +/* +|-------------------------------------------------------------------------- +| Register The Auto Loader +|-------------------------------------------------------------------------- +| +| Composer provides a convenient, automatically generated class loader for +| our application. We just need to utilize it! We'll simply require it +| into the script here so that we don't have to worry about manual +| loading any of our classes later on. It feels great to relax. +| +*/ + +require __DIR__.'/../vendor/autoload.php'; + +/* +|-------------------------------------------------------------------------- +| Turn On The Lights +|-------------------------------------------------------------------------- +| +| We need to illuminate PHP development, so let us turn on the lights. +| This bootstraps the framework and gets it ready for use, then it +| will load up this application so that we can run it and send +| the responses back to the browser and delight our users. +| +*/ + +$app = require_once __DIR__.'/../bootstrap/app.php'; + +/* +|-------------------------------------------------------------------------- +| Run The Application +|-------------------------------------------------------------------------- +| +| Once we have the application, we can handle the incoming request +| through the kernel, and send the associated response back to +| the client's browser allowing them to enjoy the creative +| and wonderful application we have prepared for them. +| +*/ + +$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); + +$response = $kernel->handle( + $request = Illuminate\Http\Request::capture() +); + +$response->send(); + +$kernel->terminate($request, $response); diff --git a/public/js/app.js b/public/js/app.js new file mode 100644 index 0000000..2d26e79 --- /dev/null +++ b/public/js/app.js @@ -0,0 +1,2 @@ +/*! For license information please see app.js.LICENSE.txt */ +(self.webpackChunk=self.webpackChunk||[]).push([[773],{368:(e,t,n)=>{"use strict";var o=n(306);function r(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect();return{width:n.width/1,height:n.height/1,top:n.top/1,right:n.right/1,bottom:n.bottom/1,left:n.left/1,x:n.left/1,y:n.top/1}}function i(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function a(e){var t=i(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function s(e){return e instanceof i(e).Element||e instanceof Element}function c(e){return e instanceof i(e).HTMLElement||e instanceof HTMLElement}function u(e){return"undefined"!=typeof ShadowRoot&&(e instanceof i(e).ShadowRoot||e instanceof ShadowRoot)}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((s(e)?e.ownerDocument:e.document)||window.document).documentElement}function p(e){return r(d(e)).left+a(e).scrollLeft}function f(e){return i(e).getComputedStyle(e)}function h(e){var t=f(e),n=t.overflow,o=t.overflowX,r=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+r+o)}function v(e,t,n){void 0===n&&(n=!1);var o,s,u=c(t),f=c(t)&&function(e){var t=e.getBoundingClientRect(),n=t.width/e.offsetWidth||1,o=t.height/e.offsetHeight||1;return 1!==n||1!==o}(t),v=d(t),m=r(e,f),b={scrollLeft:0,scrollTop:0},g={x:0,y:0};return(u||!u&&!n)&&(("body"!==l(t)||h(v))&&(b=(o=t)!==i(o)&&c(o)?{scrollLeft:(s=o).scrollLeft,scrollTop:s.scrollTop}:a(o)),c(t)?((g=r(t,!0)).x+=t.clientLeft,g.y+=t.clientTop):v&&(g.x=p(v))),{x:m.left+b.scrollLeft-g.x,y:m.top+b.scrollTop-g.y,width:m.width,height:m.height}}function m(e){var t=r(e),n=e.offsetWidth,o=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-o)<=1&&(o=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:o}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(u(e)?e.host:null)||d(e)}function g(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:c(e)&&h(e)?e:g(b(e))}function y(e,t){var n;void 0===t&&(t=[]);var o=g(e),r=o===(null==(n=e.ownerDocument)?void 0:n.body),a=i(o),s=r?[a].concat(a.visualViewport||[],h(o)?o:[]):o,c=t.concat(s);return r?c:c.concat(y(b(s)))}function w(e){return["table","td","th"].indexOf(l(e))>=0}function O(e){return c(e)&&"fixed"!==f(e).position?e.offsetParent:null}function x(e){for(var t=i(e),n=O(e);n&&w(n)&&"static"===f(n).position;)n=O(n);return n&&("html"===l(n)||"body"===l(n)&&"static"===f(n).position)?t:n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&c(e)&&"fixed"===f(e).position)return null;for(var n=b(e);c(n)&&["html","body"].indexOf(l(n))<0;){var o=f(n);if("none"!==o.transform||"none"!==o.perspective||"paint"===o.contain||-1!==["transform","perspective"].indexOf(o.willChange)||t&&"filter"===o.willChange||t&&o.filter&&"none"!==o.filter)return n;n=n.parentNode}return null}(e)||t}var E="top",k="bottom",j="right",S="left",A="auto",T=[E,k,j,S],D="start",P="end",C="viewport",L="popper",M=T.reduce((function(e,t){return e.concat([t+"-"+D,t+"-"+P])}),[]),N=[].concat(T,[A]).reduce((function(e,t){return e.concat([t,t+"-"+D,t+"-"+P])}),[]),B=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function R(e){var t=new Map,n=new Set,o=[];function r(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var o=t.get(e);o&&r(o)}})),o.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),o}var I={placement:"bottom",modifiers:[],strategy:"absolute"};function _(){for(var e=arguments.length,t=new Array(e),n=0;n=0?"x":"y"}function $(e){var t,n=e.reference,o=e.element,r=e.placement,i=r?q(r):null,a=r?V(r):null,s=n.x+n.width/2-o.width/2,c=n.y+n.height/2-o.height/2;switch(i){case E:t={x:s,y:n.y-o.height};break;case k:t={x:s,y:n.y+n.height};break;case j:t={x:n.x+n.width,y:c};break;case S:t={x:n.x-o.width,y:c};break;default:t={x:n.x,y:n.y}}var u=i?G(i):null;if(null!=u){var l="y"===u?"height":"width";switch(a){case D:t[u]=t[u]-(n[l]/2-o[l]/2);break;case P:t[u]=t[u]+(n[l]/2-o[l]/2)}}return t}const U={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=$({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}};var z=Math.max,Y=Math.min,K=Math.round,X={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Z(e){var t,n=e.popper,o=e.popperRect,r=e.placement,a=e.variation,s=e.offsets,c=e.position,u=e.gpuAcceleration,l=e.adaptive,p=e.roundOffsets,h=!0===p?function(e){var t=e.x,n=e.y,o=window.devicePixelRatio||1;return{x:K(K(t*o)/o)||0,y:K(K(n*o)/o)||0}}(s):"function"==typeof p?p(s):s,v=h.x,m=void 0===v?0:v,b=h.y,g=void 0===b?0:b,y=s.hasOwnProperty("x"),w=s.hasOwnProperty("y"),O=S,A=E,T=window;if(l){var D=x(n),C="clientHeight",L="clientWidth";D===i(n)&&"static"!==f(D=d(n)).position&&"absolute"===c&&(C="scrollHeight",L="scrollWidth"),D=D,r!==E&&(r!==S&&r!==j||a!==P)||(A=k,g-=D[C]-o.height,g*=u?1:-1),r!==S&&(r!==E&&r!==k||a!==P)||(O=j,m-=D[L]-o.width,m*=u?1:-1)}var M,N=Object.assign({position:c},l&&X);return u?Object.assign({},N,((M={})[A]=w?"0":"",M[O]=y?"0":"",M.transform=(T.devicePixelRatio||1)<=1?"translate("+m+"px, "+g+"px)":"translate3d("+m+"px, "+g+"px, 0)",M)):Object.assign({},N,((t={})[A]=w?g+"px":"",t[O]=y?m+"px":"",t.transform="",t))}const J={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,o=n.gpuAcceleration,r=void 0===o||o,i=n.adaptive,a=void 0===i||i,s=n.roundOffsets,c=void 0===s||s,u={placement:q(t.placement),variation:V(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,Z(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:c})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,Z(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};const Q={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},r=t.elements[e];c(r)&&l(r)&&(Object.assign(r.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],r=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});c(o)&&l(o)&&(Object.assign(o.style,i),Object.keys(r).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]};const ee={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.offset,i=void 0===r?[0,0]:r,a=N.reduce((function(e,n){return e[n]=function(e,t,n){var o=q(e),r=[S,E].indexOf(o)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*r,[S,j].indexOf(o)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],c=s.x,u=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=u),t.modifiersData[o]=a}};var te={left:"right",right:"left",bottom:"top",top:"bottom"};function ne(e){return e.replace(/left|right|bottom|top/g,(function(e){return te[e]}))}var oe={start:"end",end:"start"};function re(e){return e.replace(/start|end/g,(function(e){return oe[e]}))}function ie(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&u(n)){var o=t;do{if(o&&e.isSameNode(o))return!0;o=o.parentNode||o.host}while(o)}return!1}function ae(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function se(e,t){return t===C?ae(function(e){var t=i(e),n=d(e),o=t.visualViewport,r=n.clientWidth,a=n.clientHeight,s=0,c=0;return o&&(r=o.width,a=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=o.offsetLeft,c=o.offsetTop)),{width:r,height:a,x:s+p(e),y:c}}(e)):c(t)?function(e){var t=r(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):ae(function(e){var t,n=d(e),o=a(e),r=null==(t=e.ownerDocument)?void 0:t.body,i=z(n.scrollWidth,n.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),s=z(n.scrollHeight,n.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),c=-o.scrollLeft+p(e),u=-o.scrollTop;return"rtl"===f(r||n).direction&&(c+=z(n.clientWidth,r?r.clientWidth:0)-i),{width:i,height:s,x:c,y:u}}(d(e)))}function ce(e,t,n){var o="clippingParents"===t?function(e){var t=y(b(e)),n=["absolute","fixed"].indexOf(f(e).position)>=0&&c(e)?x(e):e;return s(n)?t.filter((function(e){return s(e)&&ie(e,n)&&"body"!==l(e)})):[]}(e):[].concat(t),r=[].concat(o,[n]),i=r[0],a=r.reduce((function(t,n){var o=se(e,n);return t.top=z(o.top,t.top),t.right=Y(o.right,t.right),t.bottom=Y(o.bottom,t.bottom),t.left=z(o.left,t.left),t}),se(e,i));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function ue(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function le(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function de(e,t){void 0===t&&(t={});var n=t,o=n.placement,i=void 0===o?e.placement:o,a=n.boundary,c=void 0===a?"clippingParents":a,u=n.rootBoundary,l=void 0===u?C:u,p=n.elementContext,f=void 0===p?L:p,h=n.altBoundary,v=void 0!==h&&h,m=n.padding,b=void 0===m?0:m,g=ue("number"!=typeof b?b:le(b,T)),y=f===L?"reference":L,w=e.rects.popper,O=e.elements[v?y:f],x=ce(s(O)?O:O.contextElement||d(e.elements.popper),c,l),S=r(e.elements.reference),A=$({reference:S,element:w,strategy:"absolute",placement:i}),D=ae(Object.assign({},w,A)),P=f===L?D:S,M={top:x.top-P.top+g.top,bottom:P.bottom-x.bottom+g.bottom,left:x.left-P.left+g.left,right:P.right-x.right+g.right},N=e.modifiersData.offset;if(f===L&&N){var B=N[i];Object.keys(M).forEach((function(e){var t=[j,k].indexOf(e)>=0?1:-1,n=[E,k].indexOf(e)>=0?"y":"x";M[e]+=B[n]*t}))}return M}const pe={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,o=e.name;if(!t.modifiersData[o]._skip){for(var r=n.mainAxis,i=void 0===r||r,a=n.altAxis,s=void 0===a||a,c=n.fallbackPlacements,u=n.padding,l=n.boundary,d=n.rootBoundary,p=n.altBoundary,f=n.flipVariations,h=void 0===f||f,v=n.allowedAutoPlacements,m=t.options.placement,b=q(m),g=c||(b===m||!h?[ne(m)]:function(e){if(q(e)===A)return[];var t=ne(e);return[re(e),t,re(t)]}(m)),y=[m].concat(g).reduce((function(e,n){return e.concat(q(n)===A?function(e,t){void 0===t&&(t={});var n=t,o=n.placement,r=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,c=n.allowedAutoPlacements,u=void 0===c?N:c,l=V(o),d=l?s?M:M.filter((function(e){return V(e)===l})):T,p=d.filter((function(e){return u.indexOf(e)>=0}));0===p.length&&(p=d);var f=p.reduce((function(t,n){return t[n]=de(e,{placement:n,boundary:r,rootBoundary:i,padding:a})[q(n)],t}),{});return Object.keys(f).sort((function(e,t){return f[e]-f[t]}))}(t,{placement:n,boundary:l,rootBoundary:d,padding:u,flipVariations:h,allowedAutoPlacements:v}):n)}),[]),w=t.rects.reference,O=t.rects.popper,x=new Map,P=!0,C=y[0],L=0;L=0,F=_?"width":"height",H=de(t,{placement:B,boundary:l,rootBoundary:d,altBoundary:p,padding:u}),W=_?I?j:S:I?k:E;w[F]>O[F]&&(W=ne(W));var G=ne(W),$=[];if(i&&$.push(H[R]<=0),s&&$.push(H[W]<=0,H[G]<=0),$.every((function(e){return e}))){C=B,P=!1;break}x.set(B,$)}if(P)for(var U=function(e){var t=y.find((function(t){var n=x.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return C=t,"break"},z=h?3:1;z>0;z--){if("break"===U(z))break}t.placement!==C&&(t.modifiersData[o]._skip=!0,t.placement=C,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function fe(e,t,n){return z(e,Y(t,n))}const he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.mainAxis,i=void 0===r||r,a=n.altAxis,s=void 0!==a&&a,c=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,p=n.tether,f=void 0===p||p,h=n.tetherOffset,v=void 0===h?0:h,b=de(t,{boundary:c,rootBoundary:u,padding:d,altBoundary:l}),g=q(t.placement),y=V(t.placement),w=!y,O=G(g),A="x"===O?"y":"x",T=t.modifiersData.popperOffsets,P=t.rects.reference,C=t.rects.popper,L="function"==typeof v?v(Object.assign({},t.rects,{placement:t.placement})):v,M={x:0,y:0};if(T){if(i||s){var N="y"===O?E:S,B="y"===O?k:j,R="y"===O?"height":"width",I=T[O],_=T[O]+b[N],F=T[O]-b[B],H=f?-C[R]/2:0,W=y===D?P[R]:C[R],$=y===D?-C[R]:-P[R],U=t.elements.arrow,K=f&&U?m(U):{width:0,height:0},X=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},Z=X[N],J=X[B],Q=fe(0,P[R],K[R]),ee=w?P[R]/2-H-Q-Z-L:W-Q-Z-L,te=w?-P[R]/2+H+Q+J+L:$+Q+J+L,ne=t.elements.arrow&&x(t.elements.arrow),oe=ne?"y"===O?ne.clientTop||0:ne.clientLeft||0:0,re=t.modifiersData.offset?t.modifiersData.offset[t.placement][O]:0,ie=T[O]+ee-re-oe,ae=T[O]+te-re;if(i){var se=fe(f?Y(_,ie):_,I,f?z(F,ae):F);T[O]=se,M[O]=se-I}if(s){var ce="x"===O?E:S,ue="x"===O?k:j,le=T[A],pe=le+b[ce],he=le-b[ue],ve=fe(f?Y(pe,ie):pe,le,f?z(he,ae):he);T[A]=ve,M[A]=ve-le}}t.modifiersData[o]=M}},requiresIfExists:["offset"]};const ve={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,o=e.name,r=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=q(n.placement),c=G(s),u=[S,j].indexOf(s)>=0?"height":"width";if(i&&a){var l=function(e,t){return ue("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:le(e,T))}(r.padding,n),d=m(i),p="y"===c?E:S,f="y"===c?k:j,h=n.rects.reference[u]+n.rects.reference[c]-a[c]-n.rects.popper[u],v=a[c]-n.rects.reference[c],b=x(i),g=b?"y"===c?b.clientHeight||0:b.clientWidth||0:0,y=h/2-v/2,w=l[p],O=g-d[u]-l[f],A=g/2-d[u]/2+y,D=fe(w,A,O),P=c;n.modifiersData[o]=((t={})[P]=D,t.centerOffset=D-A,t)}},effect:function(e){var t=e.state,n=e.options.element,o=void 0===n?"[data-popper-arrow]":n;null!=o&&("string"!=typeof o||(o=t.elements.popper.querySelector(o)))&&ie(t.elements.popper,o)&&(t.elements.arrow=o)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function me(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function be(e){return[E,j,k,S].some((function(t){return e[t]>=0}))}var ge=F({defaultModifiers:[W,U,J,Q,ee,pe,he,ve,{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,o=t.rects.reference,r=t.rects.popper,i=t.modifiersData.preventOverflow,a=de(t,{elementContext:"reference"}),s=de(t,{altBoundary:!0}),c=me(a,o),u=me(s,r,i),l=be(c),d=be(u);t.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:u,isReferenceHidden:l,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":l,"data-popper-escaped":d})}}]}),ye="tippy-content",we="tippy-backdrop",Oe="tippy-arrow",xe="tippy-svg-arrow",Ee={passive:!0,capture:!0},ke=function(){return document.body};function je(e,t,n){if(Array.isArray(e)){var o=e[t];return null==o?Array.isArray(n)?n[t]:n:o}return e}function Se(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function Ae(e,t){return"function"==typeof e?e.apply(void 0,t):e}function Te(e,t){return 0===t?e:function(o){clearTimeout(n),n=setTimeout((function(){e(o)}),t)};var n}function De(e){return[].concat(e)}function Pe(e,t){-1===e.indexOf(t)&&e.push(t)}function Ce(e){return e.split("-")[0]}function Le(e){return[].slice.call(e)}function Me(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function Ne(){return document.createElement("div")}function Be(e){return["Element","Fragment"].some((function(t){return Se(e,t)}))}function Re(e){return Se(e,"MouseEvent")}function Ie(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function _e(e){return Be(e)?[e]:function(e){return Se(e,"NodeList")}(e)?Le(e):Array.isArray(e)?e:Le(document.querySelectorAll(e))}function Fe(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function He(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function We(e){var t,n=De(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function qe(e,t,n){var o=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[o](t,n)}))}function Ve(e,t){for(var n=t;n;){var o;if(e.contains(n))return!0;n=null==n.getRootNode||null==(o=n.getRootNode())?void 0:o.host}return!1}var Ge={isTouch:!1},$e=0;function Ue(){Ge.isTouch||(Ge.isTouch=!0,window.performance&&document.addEventListener("mousemove",ze))}function ze(){var e=performance.now();e-$e<20&&(Ge.isTouch=!1,document.removeEventListener("mousemove",ze)),$e=e}function Ye(){var e=document.activeElement;if(Ie(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var Ke=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto;var Xe={animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},Ze=Object.assign({appendTo:ke,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},Xe,{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),Je=Object.keys(Ze);function Qe(e){var t=(e.plugins||[]).reduce((function(t,n){var o,r=n.name,i=n.defaultValue;r&&(t[r]=void 0!==e[r]?e[r]:null!=(o=Ze[r])?o:i);return t}),{});return Object.assign({},e,t)}function et(e,t){var n=Object.assign({},t,{content:Ae(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(Qe(Object.assign({},Ze,{plugins:t}))):Je).reduce((function(t,n){var o=(e.getAttribute("data-tippy-"+n)||"").trim();if(!o)return t;if("content"===n)t[n]=o;else try{t[n]=JSON.parse(o)}catch(e){t[n]=o}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},Ze.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function tt(e,t){e.innerHTML=t}function nt(e){var t=Ne();return!0===e?t.className=Oe:(t.className=xe,Be(e)?t.appendChild(e):tt(t,e)),t}function ot(e,t){Be(t.content)?(tt(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?tt(e,t.content):e.textContent=t.content)}function rt(e){var t=e.firstElementChild,n=Le(t.children);return{box:t,content:n.find((function(e){return e.classList.contains(ye)})),arrow:n.find((function(e){return e.classList.contains(Oe)||e.classList.contains(xe)})),backdrop:n.find((function(e){return e.classList.contains(we)}))}}function it(e){var t=Ne(),n=Ne();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var o=Ne();function r(n,o){var r=rt(t),i=r.box,a=r.content,s=r.arrow;o.theme?i.setAttribute("data-theme",o.theme):i.removeAttribute("data-theme"),"string"==typeof o.animation?i.setAttribute("data-animation",o.animation):i.removeAttribute("data-animation"),o.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof o.maxWidth?o.maxWidth+"px":o.maxWidth,o.role?i.setAttribute("role",o.role):i.removeAttribute("role"),n.content===o.content&&n.allowHTML===o.allowHTML||ot(a,e.props),o.arrow?s?n.arrow!==o.arrow&&(i.removeChild(s),i.appendChild(nt(o.arrow))):i.appendChild(nt(o.arrow)):s&&i.removeChild(s)}return o.className=ye,o.setAttribute("data-state","hidden"),ot(o,e.props),t.appendChild(n),n.appendChild(o),r(e.props,e.props),{popper:t,onUpdate:r}}it.$$tippy=!0;var at=1,st=[],ct=[];function ut(e,t){var n,o,r,i,a,s,c,u,l=et(e,Object.assign({},Ze,Qe(Me(t)))),d=!1,p=!1,f=!1,h=!1,v=[],m=Te(z,l.interactiveDebounce),b=at++,g=(u=l.plugins).filter((function(e,t){return u.indexOf(e)===t})),y={id:b,reference:e,popper:Ne(),popperInstance:null,props:l,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:g,clearDelayTimeouts:function(){clearTimeout(n),clearTimeout(o),cancelAnimationFrame(r)},setProps:function(t){0;if(y.state.isDestroyed)return;M("onBeforeUpdate",[y,t]),$();var n=y.props,o=et(e,Object.assign({},n,Me(t),{ignoreAttributes:!0}));y.props=o,G(),n.interactiveDebounce!==o.interactiveDebounce&&(R(),m=Te(z,o.interactiveDebounce));n.triggerTarget&&!o.triggerTarget?De(n.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):o.triggerTarget&&e.removeAttribute("aria-expanded");B(),L(),x&&x(n,o);y.popperInstance&&(Z(),Q().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));M("onAfterUpdate",[y,t])},setContent:function(e){y.setProps({content:e})},show:function(){0;var e=y.state.isVisible,t=y.state.isDestroyed,n=!y.state.isEnabled,o=Ge.isTouch&&!y.props.touch,r=je(y.props.duration,0,Ze.duration);if(e||t||n||o)return;if(T().hasAttribute("disabled"))return;if(M("onShow",[y],!1),!1===y.props.onShow(y))return;y.state.isVisible=!0,A()&&(O.style.visibility="visible");L(),H(),y.state.isMounted||(O.style.transition="none");if(A()){var i=P(),a=i.box,c=i.content;Fe([a,c],0)}s=function(){var e;if(y.state.isVisible&&!h){if(h=!0,O.offsetHeight,O.style.transition=y.props.moveTransition,A()&&y.props.animation){var t=P(),n=t.box,o=t.content;Fe([n,o],r),He([n,o],"visible")}N(),B(),Pe(ct,y),null==(e=y.popperInstance)||e.forceUpdate(),M("onMount",[y]),y.props.animation&&A()&&function(e,t){q(e,t)}(r,(function(){y.state.isShown=!0,M("onShown",[y])}))}},function(){var e,t=y.props.appendTo,n=T();e=y.props.interactive&&t===ke||"parent"===t?n.parentNode:Ae(t,[n]);e.contains(O)||e.appendChild(O);y.state.isMounted=!0,Z(),!1}()},hide:function(){0;var e=!y.state.isVisible,t=y.state.isDestroyed,n=!y.state.isEnabled,o=je(y.props.duration,1,Ze.duration);if(e||t||n)return;if(M("onHide",[y],!1),!1===y.props.onHide(y))return;y.state.isVisible=!1,y.state.isShown=!1,h=!1,d=!1,A()&&(O.style.visibility="hidden");if(R(),W(),L(!0),A()){var r=P(),i=r.box,a=r.content;y.props.animation&&(Fe([i,a],o),He([i,a],"hidden"))}N(),B(),y.props.animation?A()&&function(e,t){q(e,(function(){!y.state.isVisible&&O.parentNode&&O.parentNode.contains(O)&&t()}))}(o,y.unmount):y.unmount()},hideWithInteractivity:function(e){0;D().addEventListener("mousemove",m),Pe(st,m),m(e)},enable:function(){y.state.isEnabled=!0},disable:function(){y.hide(),y.state.isEnabled=!1},unmount:function(){0;y.state.isVisible&&y.hide();if(!y.state.isMounted)return;J(),Q().forEach((function(e){e._tippy.unmount()})),O.parentNode&&O.parentNode.removeChild(O);ct=ct.filter((function(e){return e!==y})),y.state.isMounted=!1,M("onHidden",[y])},destroy:function(){0;if(y.state.isDestroyed)return;y.clearDelayTimeouts(),y.unmount(),$(),delete e._tippy,y.state.isDestroyed=!0,M("onDestroy",[y])}};if(!l.render)return y;var w=l.render(y),O=w.popper,x=w.onUpdate;O.setAttribute("data-tippy-root",""),O.id="tippy-"+y.id,y.popper=O,e._tippy=y,O._tippy=y;var E=g.map((function(e){return e.fn(y)})),k=e.hasAttribute("aria-expanded");return G(),B(),L(),M("onCreate",[y]),l.showOnCreate&&ee(),O.addEventListener("mouseenter",(function(){y.props.interactive&&y.state.isVisible&&y.clearDelayTimeouts()})),O.addEventListener("mouseleave",(function(){y.props.interactive&&y.props.trigger.indexOf("mouseenter")>=0&&D().addEventListener("mousemove",m)})),y;function j(){var e=y.props.touch;return Array.isArray(e)?e:[e,0]}function S(){return"hold"===j()[0]}function A(){var e;return!(null==(e=y.props.render)||!e.$$tippy)}function T(){return c||e}function D(){var e=T().parentNode;return e?We(e):document}function P(){return rt(O)}function C(e){return y.state.isMounted&&!y.state.isVisible||Ge.isTouch||i&&"focus"===i.type?0:je(y.props.delay,e?0:1,Ze.delay)}function L(e){void 0===e&&(e=!1),O.style.pointerEvents=y.props.interactive&&!e?"":"none",O.style.zIndex=""+y.props.zIndex}function M(e,t,n){var o;(void 0===n&&(n=!0),E.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(o=y.props)[e].apply(o,t)}function N(){var t=y.props.aria;if(t.content){var n="aria-"+t.content,o=O.id;De(y.props.triggerTarget||e).forEach((function(e){var t=e.getAttribute(n);if(y.state.isVisible)e.setAttribute(n,t?t+" "+o:o);else{var r=t&&t.replace(o,"").trim();r?e.setAttribute(n,r):e.removeAttribute(n)}}))}}function B(){!k&&y.props.aria.expanded&&De(y.props.triggerTarget||e).forEach((function(e){y.props.interactive?e.setAttribute("aria-expanded",y.state.isVisible&&e===T()?"true":"false"):e.removeAttribute("aria-expanded")}))}function R(){D().removeEventListener("mousemove",m),st=st.filter((function(e){return e!==m}))}function I(t){if(!Ge.isTouch||!f&&"mousedown"!==t.type){var n=t.composedPath&&t.composedPath()[0]||t.target;if(!y.props.interactive||!Ve(O,n)){if(De(y.props.triggerTarget||e).some((function(e){return Ve(e,n)}))){if(Ge.isTouch)return;if(y.state.isVisible&&y.props.trigger.indexOf("click")>=0)return}else M("onClickOutside",[y,t]);!0===y.props.hideOnClick&&(y.clearDelayTimeouts(),y.hide(),p=!0,setTimeout((function(){p=!1})),y.state.isMounted||W())}}}function _(){f=!0}function F(){f=!1}function H(){var e=D();e.addEventListener("mousedown",I,!0),e.addEventListener("touchend",I,Ee),e.addEventListener("touchstart",F,Ee),e.addEventListener("touchmove",_,Ee)}function W(){var e=D();e.removeEventListener("mousedown",I,!0),e.removeEventListener("touchend",I,Ee),e.removeEventListener("touchstart",F,Ee),e.removeEventListener("touchmove",_,Ee)}function q(e,t){var n=P().box;function o(e){e.target===n&&(qe(n,"remove",o),t())}if(0===e)return t();qe(n,"remove",a),qe(n,"add",o),a=o}function V(t,n,o){void 0===o&&(o=!1),De(y.props.triggerTarget||e).forEach((function(e){e.addEventListener(t,n,o),v.push({node:e,eventType:t,handler:n,options:o})}))}function G(){var e;S()&&(V("touchstart",U,{passive:!0}),V("touchend",Y,{passive:!0})),(e=y.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(V(e,U),e){case"mouseenter":V("mouseleave",Y);break;case"focus":V(Ke?"focusout":"blur",K);break;case"focusin":V("focusout",K)}}))}function $(){v.forEach((function(e){var t=e.node,n=e.eventType,o=e.handler,r=e.options;t.removeEventListener(n,o,r)})),v=[]}function U(e){var t,n=!1;if(y.state.isEnabled&&!X(e)&&!p){var o="focus"===(null==(t=i)?void 0:t.type);i=e,c=e.currentTarget,B(),!y.state.isVisible&&Re(e)&&st.forEach((function(t){return t(e)})),"click"===e.type&&(y.props.trigger.indexOf("mouseenter")<0||d)&&!1!==y.props.hideOnClick&&y.state.isVisible?n=!0:ee(e),"click"===e.type&&(d=!n),n&&!o&&te(e)}}function z(e){var t=e.target,n=T().contains(t)||O.contains(t);if("mousemove"!==e.type||!n){var o=Q().concat(O).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:l}:null})).filter(Boolean);(function(e,t){var n=t.clientX,o=t.clientY;return e.every((function(e){var t=e.popperRect,r=e.popperState,i=e.props.interactiveBorder,a=Ce(r.placement),s=r.modifiersData.offset;if(!s)return!0;var c="bottom"===a?s.top.y:0,u="top"===a?s.bottom.y:0,l="right"===a?s.left.x:0,d="left"===a?s.right.x:0,p=t.top-o+c>i,f=o-t.bottom-u>i,h=t.left-n+l>i,v=n-t.right-d>i;return p||f||h||v}))})(o,e)&&(R(),te(e))}}function Y(e){X(e)||y.props.trigger.indexOf("click")>=0&&d||(y.props.interactive?y.hideWithInteractivity(e):te(e))}function K(e){y.props.trigger.indexOf("focusin")<0&&e.target!==T()||y.props.interactive&&e.relatedTarget&&O.contains(e.relatedTarget)||te(e)}function X(e){return!!Ge.isTouch&&S()!==e.type.indexOf("touch")>=0}function Z(){J();var t=y.props,n=t.popperOptions,o=t.placement,r=t.offset,i=t.getReferenceClientRect,a=t.moveTransition,c=A()?rt(O).arrow:null,u=i?{getBoundingClientRect:i,contextElement:i.contextElement||T()}:e,l={name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(A()){var n=P().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}},d=[{name:"offset",options:{offset:r}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!a}},l];A()&&c&&d.push({name:"arrow",options:{element:c,padding:3}}),d.push.apply(d,(null==n?void 0:n.modifiers)||[]),y.popperInstance=ge(u,O,Object.assign({},n,{placement:o,onFirstUpdate:s,modifiers:d}))}function J(){y.popperInstance&&(y.popperInstance.destroy(),y.popperInstance=null)}function Q(){return Le(O.querySelectorAll("[data-tippy-root]"))}function ee(e){y.clearDelayTimeouts(),e&&M("onTrigger",[y,e]),H();var t=C(!0),o=j(),r=o[0],i=o[1];Ge.isTouch&&"hold"===r&&i&&(t=i),t?n=setTimeout((function(){y.show()}),t):y.show()}function te(e){if(y.clearDelayTimeouts(),M("onUntrigger",[y,e]),y.state.isVisible){if(!(y.props.trigger.indexOf("mouseenter")>=0&&y.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&d)){var t=C(!1);t?o=setTimeout((function(){y.state.isVisible&&y.hide()}),t):r=requestAnimationFrame((function(){y.hide()}))}}else W()}}function lt(e,t){void 0===t&&(t={});var n=Ze.plugins.concat(t.plugins||[]);document.addEventListener("touchstart",Ue,Ee),window.addEventListener("blur",Ye);var o=Object.assign({},t,{plugins:n}),r=_e(e).reduce((function(e,t){var n=t&&ut(t,o);return n&&e.push(n),e}),[]);return Be(e)?r[0]:r}lt.defaultProps=Ze,lt.setDefaultProps=function(e){Object.keys(e).forEach((function(t){Ze[t]=e[t]}))},lt.currentInput=Ge;Object.assign({},Q,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}});lt.setDefaultProps({render:it});const dt=lt;var pt=n(379),ft=n.n(pt),ht=n(607),vt={insert:"head",singleton:!1};ft()(ht.Z,vt);ht.Z.locals;function mt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function bt(e){for(var t=1;t=0&&yt.splice(n,1)}},Ot=[],xt=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.body;Array.from(e.querySelectorAll("[data-tippy-content], [data-tippy-hover]")).forEach((function(e){var t=bt({},wt);e.getAttribute("data-tippy-hover")&&(t.touch="hold",t.trigger="mouseenter",t.content=function(e){return e.dataset.tippyHover}),e._tippy?e._tippy.setProps(t):Ot.push(dt(e,t))}))};function Et(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function kt(e){return e instanceof Et(e).Element||e instanceof Element}function jt(e){return e instanceof Et(e).HTMLElement||e instanceof HTMLElement}function St(e){return"undefined"!=typeof ShadowRoot&&(e instanceof Et(e).ShadowRoot||e instanceof ShadowRoot)}xt(),window.tooltipSettings=wt,window.initTippy=xt,window.destroyTippy=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.body;e.querySelectorAll("[data-tippy-content], [data-tippy-hover]").forEach((function(e){e._tippy?e.parentNode||e._tippy.destroy():console.error("Tippy tooltip instance not found. Ensure all tippy instances are properly initialized.",e)}))},document.addEventListener("scroll",(function(){return yt.forEach((function(e){return e.hide(0)}))})),window.initClipboard=function(){dt(".clipboard",{trigger:"click",content:function(e){return e.getAttribute("tooltip-content")},onShow:function(e){setTimeout((function(){e.hide()}),3e3)}})},"undefined"!=typeof Livewire&&Livewire.hook("message.processed",(function(e,t){t.el,Ot=Ot.reduce((function(e,t){var n=t.reference;return n.parentNode&&(n.getAttribute("data-tippy-hover")||n.getAttribute("data-tippy-content"))?e.push(t):t.destroy(),e}),[]),xt(t.el)})),window.tippy=dt;var At=Math.max,Tt=Math.min,Dt=Math.round;function Pt(){var e=navigator.userAgentData;return null!=e&&e.brands?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function Ct(){return!/^((?!chrome|android).)*safari/i.test(Pt())}function Lt(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var o=e.getBoundingClientRect(),r=1,i=1;t&&jt(e)&&(r=e.offsetWidth>0&&Dt(o.width)/e.offsetWidth||1,i=e.offsetHeight>0&&Dt(o.height)/e.offsetHeight||1);var a=(kt(e)?Et(e):window).visualViewport,s=!Ct()&&n,c=(o.left+(s&&a?a.offsetLeft:0))/r,u=(o.top+(s&&a?a.offsetTop:0))/i,l=o.width/r,d=o.height/i;return{width:l,height:d,top:u,right:c+l,bottom:u+d,left:c,x:c,y:u}}function Mt(e){var t=Et(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function Nt(e){return e?(e.nodeName||"").toLowerCase():null}function Bt(e){return((kt(e)?e.ownerDocument:e.document)||window.document).documentElement}function Rt(e){return Lt(Bt(e)).left+Mt(e).scrollLeft}function It(e){return Et(e).getComputedStyle(e)}function _t(e){var t=It(e),n=t.overflow,o=t.overflowX,r=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+r+o)}function Ft(e,t,n){void 0===n&&(n=!1);var o,r,i=jt(t),a=jt(t)&&function(e){var t=e.getBoundingClientRect(),n=Dt(t.width)/e.offsetWidth||1,o=Dt(t.height)/e.offsetHeight||1;return 1!==n||1!==o}(t),s=Bt(t),c=Lt(e,a,n),u={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(i||!i&&!n)&&(("body"!==Nt(t)||_t(s))&&(u=(o=t)!==Et(o)&&jt(o)?{scrollLeft:(r=o).scrollLeft,scrollTop:r.scrollTop}:Mt(o)),jt(t)?((l=Lt(t,!0)).x+=t.clientLeft,l.y+=t.clientTop):s&&(l.x=Rt(s))),{x:c.left+u.scrollLeft-l.x,y:c.top+u.scrollTop-l.y,width:c.width,height:c.height}}function Ht(e){var t=Lt(e),n=e.offsetWidth,o=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-o)<=1&&(o=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:o}}function Wt(e){return"html"===Nt(e)?e:e.assignedSlot||e.parentNode||(St(e)?e.host:null)||Bt(e)}function qt(e){return["html","body","#document"].indexOf(Nt(e))>=0?e.ownerDocument.body:jt(e)&&_t(e)?e:qt(Wt(e))}function Vt(e,t){var n;void 0===t&&(t=[]);var o=qt(e),r=o===(null==(n=e.ownerDocument)?void 0:n.body),i=Et(o),a=r?[i].concat(i.visualViewport||[],_t(o)?o:[]):o,s=t.concat(a);return r?s:s.concat(Vt(Wt(a)))}function Gt(e){return["table","td","th"].indexOf(Nt(e))>=0}function $t(e){return jt(e)&&"fixed"!==It(e).position?e.offsetParent:null}function Ut(e){for(var t=Et(e),n=$t(e);n&&Gt(n)&&"static"===It(n).position;)n=$t(n);return n&&("html"===Nt(n)||"body"===Nt(n)&&"static"===It(n).position)?t:n||function(e){var t=/firefox/i.test(Pt());if(/Trident/i.test(Pt())&&jt(e)&&"fixed"===It(e).position)return null;var n=Wt(e);for(St(n)&&(n=n.host);jt(n)&&["html","body"].indexOf(Nt(n))<0;){var o=It(n);if("none"!==o.transform||"none"!==o.perspective||"paint"===o.contain||-1!==["transform","perspective"].indexOf(o.willChange)||t&&"filter"===o.willChange||t&&o.filter&&"none"!==o.filter)return n;n=n.parentNode}return null}(e)||t}var zt="top",Yt="bottom",Kt="right",Xt="left",Zt="auto",Jt=[zt,Yt,Kt,Xt],Qt="start",en="end",tn="viewport",nn="popper",on=Jt.reduce((function(e,t){return e.concat([t+"-"+Qt,t+"-"+en])}),[]),rn=[].concat(Jt,[Zt]).reduce((function(e,t){return e.concat([t,t+"-"+Qt,t+"-"+en])}),[]),an=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function sn(e){var t=new Map,n=new Set,o=[];function r(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var o=t.get(e);o&&r(o)}})),o.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),o}var cn={placement:"bottom",modifiers:[],strategy:"absolute"};function un(){for(var e=arguments.length,t=new Array(e),n=0;n=0?"x":"y"}function mn(e){var t,n=e.reference,o=e.element,r=e.placement,i=r?fn(r):null,a=r?hn(r):null,s=n.x+n.width/2-o.width/2,c=n.y+n.height/2-o.height/2;switch(i){case zt:t={x:s,y:n.y-o.height};break;case Yt:t={x:s,y:n.y+n.height};break;case Kt:t={x:n.x+n.width,y:c};break;case Xt:t={x:n.x-o.width,y:c};break;default:t={x:n.x,y:n.y}}var u=i?vn(i):null;if(null!=u){var l="y"===u?"height":"width";switch(a){case Qt:t[u]=t[u]-(n[l]/2-o[l]/2);break;case en:t[u]=t[u]+(n[l]/2-o[l]/2)}}return t}var bn={top:"auto",right:"auto",bottom:"auto",left:"auto"};function gn(e){var t,n=e.popper,o=e.popperRect,r=e.placement,i=e.variation,a=e.offsets,s=e.position,c=e.gpuAcceleration,u=e.adaptive,l=e.roundOffsets,d=e.isFixed,p=a.x,f=void 0===p?0:p,h=a.y,v=void 0===h?0:h,m="function"==typeof l?l({x:f,y:v}):{x:f,y:v};f=m.x,v=m.y;var b=a.hasOwnProperty("x"),g=a.hasOwnProperty("y"),y=Xt,w=zt,O=window;if(u){var x=Ut(n),E="clientHeight",k="clientWidth";if(x===Et(n)&&"static"!==It(x=Bt(n)).position&&"absolute"===s&&(E="scrollHeight",k="scrollWidth"),x=x,r===zt||(r===Xt||r===Kt)&&i===en)w=Yt,v-=(d&&x===O&&O.visualViewport?O.visualViewport.height:x[E])-o.height,v*=c?1:-1;if(r===Xt||(r===zt||r===Yt)&&i===en)y=Kt,f-=(d&&x===O&&O.visualViewport?O.visualViewport.width:x[k])-o.width,f*=c?1:-1}var j,S=Object.assign({position:s},u&&bn),A=!0===l?function(e){var t=e.x,n=e.y,o=window.devicePixelRatio||1;return{x:Dt(t*o)/o||0,y:Dt(n*o)/o||0}}({x:f,y:v}):{x:f,y:v};return f=A.x,v=A.y,c?Object.assign({},S,((j={})[w]=g?"0":"",j[y]=b?"0":"",j.transform=(O.devicePixelRatio||1)<=1?"translate("+f+"px, "+v+"px)":"translate3d("+f+"px, "+v+"px, 0)",j)):Object.assign({},S,((t={})[w]=g?v+"px":"",t[y]=b?f+"px":"",t.transform="",t))}const yn={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,o=n.gpuAcceleration,r=void 0===o||o,i=n.adaptive,a=void 0===i||i,s=n.roundOffsets,c=void 0===s||s,u={placement:fn(t.placement),variation:hn(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,gn(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:c})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,gn(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};const wn={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.offset,i=void 0===r?[0,0]:r,a=rn.reduce((function(e,n){return e[n]=function(e,t,n){var o=fn(e),r=[Xt,zt].indexOf(o)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*r,[Xt,Kt].indexOf(o)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],c=s.x,u=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=u),t.modifiersData[o]=a}};var On={left:"right",right:"left",bottom:"top",top:"bottom"};function xn(e){return e.replace(/left|right|bottom|top/g,(function(e){return On[e]}))}var En={start:"end",end:"start"};function kn(e){return e.replace(/start|end/g,(function(e){return En[e]}))}function jn(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&St(n)){var o=t;do{if(o&&e.isSameNode(o))return!0;o=o.parentNode||o.host}while(o)}return!1}function Sn(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function An(e,t,n){return t===tn?Sn(function(e,t){var n=Et(e),o=Bt(e),r=n.visualViewport,i=o.clientWidth,a=o.clientHeight,s=0,c=0;if(r){i=r.width,a=r.height;var u=Ct();(u||!u&&"fixed"===t)&&(s=r.offsetLeft,c=r.offsetTop)}return{width:i,height:a,x:s+Rt(e),y:c}}(e,n)):kt(t)?function(e,t){var n=Lt(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(t,n):Sn(function(e){var t,n=Bt(e),o=Mt(e),r=null==(t=e.ownerDocument)?void 0:t.body,i=At(n.scrollWidth,n.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),a=At(n.scrollHeight,n.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),s=-o.scrollLeft+Rt(e),c=-o.scrollTop;return"rtl"===It(r||n).direction&&(s+=At(n.clientWidth,r?r.clientWidth:0)-i),{width:i,height:a,x:s,y:c}}(Bt(e)))}function Tn(e,t,n,o){var r="clippingParents"===t?function(e){var t=Vt(Wt(e)),n=["absolute","fixed"].indexOf(It(e).position)>=0&&jt(e)?Ut(e):e;return kt(n)?t.filter((function(e){return kt(e)&&jn(e,n)&&"body"!==Nt(e)})):[]}(e):[].concat(t),i=[].concat(r,[n]),a=i[0],s=i.reduce((function(t,n){var r=An(e,n,o);return t.top=At(r.top,t.top),t.right=Tt(r.right,t.right),t.bottom=Tt(r.bottom,t.bottom),t.left=At(r.left,t.left),t}),An(e,a,o));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}function Dn(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function Pn(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Cn(e,t){void 0===t&&(t={});var n=t,o=n.placement,r=void 0===o?e.placement:o,i=n.strategy,a=void 0===i?e.strategy:i,s=n.boundary,c=void 0===s?"clippingParents":s,u=n.rootBoundary,l=void 0===u?tn:u,d=n.elementContext,p=void 0===d?nn:d,f=n.altBoundary,h=void 0!==f&&f,v=n.padding,m=void 0===v?0:v,b=Dn("number"!=typeof m?m:Pn(m,Jt)),g=p===nn?"reference":nn,y=e.rects.popper,w=e.elements[h?g:p],O=Tn(kt(w)?w:w.contextElement||Bt(e.elements.popper),c,l,a),x=Lt(e.elements.reference),E=mn({reference:x,element:y,strategy:"absolute",placement:r}),k=Sn(Object.assign({},y,E)),j=p===nn?k:x,S={top:O.top-j.top+b.top,bottom:j.bottom-O.bottom+b.bottom,left:O.left-j.left+b.left,right:j.right-O.right+b.right},A=e.modifiersData.offset;if(p===nn&&A){var T=A[r];Object.keys(S).forEach((function(e){var t=[Kt,Yt].indexOf(e)>=0?1:-1,n=[zt,Yt].indexOf(e)>=0?"y":"x";S[e]+=T[n]*t}))}return S}const Ln={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,o=e.name;if(!t.modifiersData[o]._skip){for(var r=n.mainAxis,i=void 0===r||r,a=n.altAxis,s=void 0===a||a,c=n.fallbackPlacements,u=n.padding,l=n.boundary,d=n.rootBoundary,p=n.altBoundary,f=n.flipVariations,h=void 0===f||f,v=n.allowedAutoPlacements,m=t.options.placement,b=fn(m),g=c||(b===m||!h?[xn(m)]:function(e){if(fn(e)===Zt)return[];var t=xn(e);return[kn(e),t,kn(t)]}(m)),y=[m].concat(g).reduce((function(e,n){return e.concat(fn(n)===Zt?function(e,t){void 0===t&&(t={});var n=t,o=n.placement,r=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,c=n.allowedAutoPlacements,u=void 0===c?rn:c,l=hn(o),d=l?s?on:on.filter((function(e){return hn(e)===l})):Jt,p=d.filter((function(e){return u.indexOf(e)>=0}));0===p.length&&(p=d);var f=p.reduce((function(t,n){return t[n]=Cn(e,{placement:n,boundary:r,rootBoundary:i,padding:a})[fn(n)],t}),{});return Object.keys(f).sort((function(e,t){return f[e]-f[t]}))}(t,{placement:n,boundary:l,rootBoundary:d,padding:u,flipVariations:h,allowedAutoPlacements:v}):n)}),[]),w=t.rects.reference,O=t.rects.popper,x=new Map,E=!0,k=y[0],j=0;j=0,P=D?"width":"height",C=Cn(t,{placement:S,boundary:l,rootBoundary:d,altBoundary:p,padding:u}),L=D?T?Kt:Xt:T?Yt:zt;w[P]>O[P]&&(L=xn(L));var M=xn(L),N=[];if(i&&N.push(C[A]<=0),s&&N.push(C[L]<=0,C[M]<=0),N.every((function(e){return e}))){k=S,E=!1;break}x.set(S,N)}if(E)for(var B=function(e){var t=y.find((function(t){var n=x.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return k=t,"break"},R=h?3:1;R>0;R--){if("break"===B(R))break}t.placement!==k&&(t.modifiersData[o]._skip=!0,t.placement=k,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Mn(e,t,n){return At(e,Tt(t,n))}const Nn={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,o=e.name,r=n.mainAxis,i=void 0===r||r,a=n.altAxis,s=void 0!==a&&a,c=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,p=n.tether,f=void 0===p||p,h=n.tetherOffset,v=void 0===h?0:h,m=Cn(t,{boundary:c,rootBoundary:u,padding:d,altBoundary:l}),b=fn(t.placement),g=hn(t.placement),y=!g,w=vn(b),O="x"===w?"y":"x",x=t.modifiersData.popperOffsets,E=t.rects.reference,k=t.rects.popper,j="function"==typeof v?v(Object.assign({},t.rects,{placement:t.placement})):v,S="number"==typeof j?{mainAxis:j,altAxis:j}:Object.assign({mainAxis:0,altAxis:0},j),A=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,T={x:0,y:0};if(x){if(i){var D,P="y"===w?zt:Xt,C="y"===w?Yt:Kt,L="y"===w?"height":"width",M=x[w],N=M+m[P],B=M-m[C],R=f?-k[L]/2:0,I=g===Qt?E[L]:k[L],_=g===Qt?-k[L]:-E[L],F=t.elements.arrow,H=f&&F?Ht(F):{width:0,height:0},W=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},q=W[P],V=W[C],G=Mn(0,E[L],H[L]),$=y?E[L]/2-R-G-q-S.mainAxis:I-G-q-S.mainAxis,U=y?-E[L]/2+R+G+V+S.mainAxis:_+G+V+S.mainAxis,z=t.elements.arrow&&Ut(t.elements.arrow),Y=z?"y"===w?z.clientTop||0:z.clientLeft||0:0,K=null!=(D=null==A?void 0:A[w])?D:0,X=M+U-K,Z=Mn(f?Tt(N,M+$-K-Y):N,M,f?At(B,X):B);x[w]=Z,T[w]=Z-M}if(s){var J,Q="x"===w?zt:Xt,ee="x"===w?Yt:Kt,te=x[O],ne="y"===O?"height":"width",oe=te+m[Q],re=te-m[ee],ie=-1!==[zt,Xt].indexOf(b),ae=null!=(J=null==A?void 0:A[O])?J:0,se=ie?oe:te-E[ne]-k[ne]-ae+S.altAxis,ce=ie?te+E[ne]+k[ne]-ae-S.altAxis:re,ue=f&&ie?function(e,t,n){var o=Mn(e,t,n);return o>n?n:o}(se,te,ce):Mn(f?se:oe,te,f?ce:re);x[O]=ue,T[O]=ue-te}t.modifiersData[o]=T}},requiresIfExists:["offset"]};const Bn={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,o=e.name,r=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=fn(n.placement),c=vn(s),u=[Xt,Kt].indexOf(s)>=0?"height":"width";if(i&&a){var l=function(e,t){return Dn("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:Pn(e,Jt))}(r.padding,n),d=Ht(i),p="y"===c?zt:Xt,f="y"===c?Yt:Kt,h=n.rects.reference[u]+n.rects.reference[c]-a[c]-n.rects.popper[u],v=a[c]-n.rects.reference[c],m=Ut(i),b=m?"y"===c?m.clientHeight||0:m.clientWidth||0:0,g=h/2-v/2,y=l[p],w=b-d[u]-l[f],O=b/2-d[u]/2+g,x=Mn(y,O,w),E=c;n.modifiersData[o]=((t={})[E]=x,t.centerOffset=x-O,t)}},effect:function(e){var t=e.state,n=e.options.element,o=void 0===n?"[data-popper-arrow]":n;null!=o&&("string"!=typeof o||(o=t.elements.popper.querySelector(o)))&&jn(t.elements.popper,o)&&(t.elements.arrow=o)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Rn(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function In(e){return[zt,Kt,Yt,Xt].some((function(t){return e[t]>=0}))}var _n=ln({defaultModifiers:[pn,{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=mn({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},yn,{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},r=t.elements[e];jt(r)&&Nt(r)&&(Object.assign(r.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],r=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});jt(o)&&Nt(o)&&(Object.assign(o.style,i),Object.keys(r).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]},wn,Ln,Nn,Bn,{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,o=t.rects.reference,r=t.rects.popper,i=t.modifiersData.preventOverflow,a=Cn(t,{elementContext:"reference"}),s=Cn(t,{altBoundary:!0}),c=Rn(a,o),u=Rn(s,r,i),l=In(c),d=In(u);t.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:u,isReferenceHidden:l,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":l,"data-popper-escaped":d})}}]});function Fn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Hn(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:qn.defaultSettings;e.onOpened&&e.onOpened(this.$el)},onClosed:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:qn.defaultSettings;e.onClosed&&e.onClosed(this.$el)},setup:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"dropdownOpen",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:qn.defaultSettings;t=Hn(Hn({},qn.defaultSettings),t);var n={propertyName:e,popperInstance:null,update:function(){this[this.propertyName]&&this.popperInstance.update()},preAdjustDropdownPosition:function(e){e.style.opacity="0",e.style.display="block",this.update(),e.style.removeProperty("opacity"),e.style.removeProperty("display")},toggle:function(){this[this.propertyName]=!this[this.propertyName]},close:function(){this[this.propertyName]=!1},open:function(){this[this.propertyName]=!0},init:function(){var n=this,o=this.$el,r=o.querySelector(".dropdown"),i=o.querySelector(".dropdown-button");this.popperInstance=_n(i,r,{strategy:"fixed",placement:t.placement,modifiers:[{name:"preventOverflow"},{name:"offset",options:{offset:t.offset}}]}),this.$watch(e,(function(e){e?(n.preAdjustDropdownPosition(r),n.$nextTick((function(){n.update(),qn.onOpened.call(n,t)}))):n.$nextTick((function(){qn.onClosed.call(n,t)}))}))}};return n[e]=!1,n}};const Vn=qn;var Gn=!1;if("undefined"!=typeof window){var $n={get passive(){Gn=!0}};window.addEventListener("testPassive",null,$n),window.removeEventListener("testPassive",null,$n)}var Un="undefined"!=typeof window&&window.navigator&&window.navigator.platform&&(/iP(ad|hone|od)/.test(window.navigator.platform)||"MacIntel"===window.navigator.platform&&window.navigator.maxTouchPoints>1),zn=[],Yn=!1,Kn=-1,Xn=void 0,Zn=void 0,Jn=function(e){return zn.some((function(t){return!(!t.options.allowTouchMove||!t.options.allowTouchMove(e))}))},Qn=function(e){var t=e||window.event;return!!Jn(t.target)||(t.touches.length>1||(t.preventDefault&&t.preventDefault(),!1))},eo=function(){void 0!==Zn&&(document.body.style.paddingRight=Zn,Zn=void 0),void 0!==Xn&&(document.body.style.overflow=Xn,Xn=void 0)},to=function(e,t){if(e){if(!zn.some((function(t){return t.targetElement===e}))){var n={targetElement:e,options:t||{}};zn=[].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0||function(e){return!!e&&e.scrollHeight-e.scrollTop<=e.clientHeight}(t)&&n<0?Qn(e):e.stopPropagation())}(t,e)},Yn||(document.addEventListener("touchmove",Qn,Gn?{passive:!1}:void 0),Yn=!0)):function(e){if(void 0===Zn){var t=!!e&&!0===e.reserveScrollBarGap,n=window.innerWidth-document.documentElement.clientWidth;t&&n>0&&(Zn=document.body.style.paddingRight,document.body.style.paddingRight=n+"px")}void 0===Xn&&(Xn=document.body.style.overflow,document.body.style.overflow="hidden")}(t)}}else console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.")},no=function(){Un?(zn.forEach((function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null})),Yn&&(document.removeEventListener("touchmove",Qn,Gn?{passive:!1}:void 0),Yn=!1),Kn=-1):eo(),zn=[]},oo=function(e){e?(zn=zn.filter((function(t){return t.targetElement!==e})),Un?(e.ontouchstart=null,e.ontouchmove=null,Yn&&0===zn.length&&(document.removeEventListener("touchmove",Qn,Gn?{passive:!1}:void 0),Yn=!1)):zn.length||eo()):console.error("enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.")},ro=["input","select","textarea","a[href]","button","[tabindex]:not(slot)","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"details>summary:first-of-type","details"],io=ro.join(","),ao="undefined"==typeof Element,so=ao?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,co=!ao&&Element.prototype.getRootNode?function(e){return e.getRootNode()}:function(e){return e.ownerDocument},uo=function(e,t,n){var o=Array.prototype.slice.apply(e.querySelectorAll(io));return t&&so.call(e,io)&&o.unshift(e),o=o.filter(n)},lo=function e(t,n,o){for(var r=[],i=Array.from(t);i.length;){var a=i.shift();if("SLOT"===a.tagName){var s=a.assignedElements(),c=e(s.length?s:a.children,!0,o);o.flatten?r.push.apply(r,c):r.push({scope:a,candidates:c})}else{so.call(a,io)&&o.filter(a)&&(n||!t.includes(a))&&r.push(a);var u=a.shadowRoot||"function"==typeof o.getShadowRoot&&o.getShadowRoot(a),l=!o.shadowRootFilter||o.shadowRootFilter(a);if(u&&l){var d=e(!0===u?a.children:u.children,!0,o);o.flatten?r.push.apply(r,d):r.push({scope:a,candidates:d})}else i.unshift.apply(i,a.children)}}return r},po=function(e,t){return e.tabIndex<0&&(t||/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||e.isContentEditable)&&isNaN(parseInt(e.getAttribute("tabindex"),10))?0:e.tabIndex},fo=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},ho=function(e){return"INPUT"===e.tagName},vo=function(e){return function(e){return ho(e)&&"radio"===e.type}(e)&&!function(e){if(!e.name)return!0;var t,n=e.form||co(e),o=function(e){return n.querySelectorAll('input[type="radio"][name="'+e+'"]')};if("undefined"!=typeof window&&void 0!==window.CSS&&"function"==typeof window.CSS.escape)t=o(window.CSS.escape(e.name));else try{t=o(e.name)}catch(e){return console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s",e.message),!1}var r=function(e,t){for(var n=0;nsummary:first-of-type")?e.parentElement:e;if(so.call(r,"details:not([open]) *"))return!0;var i=co(e).host,a=(null==i?void 0:i.ownerDocument.contains(i))||e.ownerDocument.contains(e);if(n&&"full"!==n){if("non-zero-area"===n)return mo(e)}else{if("function"==typeof o){for(var s=e;e;){var c=e.parentElement,u=co(e);if(c&&!c.shadowRoot&&!0===o(c))return mo(e);e=e.assignedSlot?e.assignedSlot:c||u===e.ownerDocument?c:u.host}e=s}if(a)return!e.getClientRects().length}return!1}(t,e)||function(e){return"DETAILS"===e.tagName&&Array.prototype.slice.apply(e.children).some((function(e){return"SUMMARY"===e.tagName}))}(t)||function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if("FIELDSET"===t.tagName&&t.disabled){for(var n=0;n=0)},wo=function e(t){var n=[],o=[];return t.forEach((function(t,r){var i=!!t.scope,a=i?t.scope:t,s=po(a,i),c=i?e(t.candidates):a;0===s?i?n.push.apply(n,c):n.push(a):o.push({documentOrder:r,tabIndex:s,item:t,isScope:i,content:c})})),o.sort(fo).reduce((function(e,t){return t.isScope?e.push.apply(e,t.content):e.push(t.content),e}),[]).concat(n)},Oo=function(e,t){var n;return n=(t=t||{}).getShadowRoot?lo([e],t.includeContainer,{filter:go.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:yo}):uo(e,t.includeContainer,go.bind(null,t)),wo(n)},xo=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return!1!==so.call(e,io)&&go(t,e)},Eo=ro.concat("iframe").join(","),ko=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return!1!==so.call(e,Eo)&&bo(t,e)};function jo(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function So(e){for(var t=1;t0){var t=To[To.length-1];t!==e&&t.pause()}var n=To.indexOf(e);-1===n||To.splice(n,1),To.push(e)},deactivateTrap:function(e){var t=To.indexOf(e);-1!==t&&To.splice(t,1),To.length>0&&To[To.length-1].unpause()}}),Po=function(e){return setTimeout(e,0)},Co=function(e,t){var n=-1;return e.every((function(e,o){return!t(e)||(n=o,!1)})),n},Lo=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o1?n-1:0),a=1;a=0)e=o.activeElement;else{var t=i.tabbableGroups[0];e=t&&t.firstTabbableNode||c("fallbackFocus")}if(!e)throw new Error("Your focus-trap needs to have at least one focusable element");return e},l=function(){if(i.containerGroups=i.containers.map((function(e){var t=Oo(e,r.tabbableOptions),n=function(e,t){return(t=t||{}).getShadowRoot?lo([e],t.includeContainer,{filter:bo.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):uo(e,t.includeContainer,bo.bind(null,t))}(e,r.tabbableOptions);return{container:e,tabbableNodes:t,focusableNodes:n,firstTabbableNode:t.length>0?t[0]:null,lastTabbableNode:t.length>0?t[t.length-1]:null,nextTabbableNode:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=n.findIndex((function(t){return t===e}));if(!(o<0))return t?n.slice(o+1).find((function(e){return xo(e,r.tabbableOptions)})):n.slice(0,o).reverse().find((function(e){return xo(e,r.tabbableOptions)}))}}})),i.tabbableGroups=i.containerGroups.filter((function(e){return e.tabbableNodes.length>0})),i.tabbableGroups.length<=0&&!c("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times")},d=function e(t){!1!==t&&t!==o.activeElement&&(t&&t.focus?(t.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=t,function(e){return e.tagName&&"input"===e.tagName.toLowerCase()&&"function"==typeof e.select}(t)&&t.select()):e(u()))},p=function(e){var t=c("setReturnFocus",e);return t||!1!==t&&e},f=function(e){var t=Mo(e);s(t)>=0||(Lo(r.clickOutsideDeactivates,e)?n.deactivate({returnFocus:r.returnFocusOnDeactivate&&!ko(t,r.tabbableOptions)}):Lo(r.allowOutsideClick,e)||e.preventDefault())},h=function(e){var t=Mo(e),n=s(t)>=0;n||t instanceof Document?n&&(i.mostRecentlyFocusedNode=t):(e.stopImmediatePropagation(),d(i.mostRecentlyFocusedNode||u()))},v=function(e){if(function(e){return"Escape"===e.key||"Esc"===e.key||27===e.keyCode}(e)&&!1!==Lo(r.escapeDeactivates,e))return e.preventDefault(),void n.deactivate();(function(e){return"Tab"===e.key||9===e.keyCode})(e)&&function(e){var t=Mo(e);l();var n=null;if(i.tabbableGroups.length>0){var o=s(t),a=o>=0?i.containerGroups[o]:void 0;if(o<0)n=e.shiftKey?i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:i.tabbableGroups[0].firstTabbableNode;else if(e.shiftKey){var u=Co(i.tabbableGroups,(function(e){var n=e.firstTabbableNode;return t===n}));if(u<0&&(a.container===t||ko(t,r.tabbableOptions)&&!xo(t,r.tabbableOptions)&&!a.nextTabbableNode(t,!1))&&(u=o),u>=0){var p=0===u?i.tabbableGroups.length-1:u-1;n=i.tabbableGroups[p].lastTabbableNode}}else{var f=Co(i.tabbableGroups,(function(e){var n=e.lastTabbableNode;return t===n}));if(f<0&&(a.container===t||ko(t,r.tabbableOptions)&&!xo(t,r.tabbableOptions)&&!a.nextTabbableNode(t))&&(f=o),f>=0){var h=f===i.tabbableGroups.length-1?0:f+1;n=i.tabbableGroups[h].firstTabbableNode}}}else n=c("fallbackFocus");n&&(e.preventDefault(),d(n))}(e)},m=function(e){var t=Mo(e);s(t)>=0||Lo(r.clickOutsideDeactivates,e)||Lo(r.allowOutsideClick,e)||(e.preventDefault(),e.stopImmediatePropagation())},b=function(){if(i.active)return Do.activateTrap(n),i.delayInitialFocusTimer=r.delayInitialFocus?Po((function(){d(u())})):d(u()),o.addEventListener("focusin",h,!0),o.addEventListener("mousedown",f,{capture:!0,passive:!1}),o.addEventListener("touchstart",f,{capture:!0,passive:!1}),o.addEventListener("click",m,{capture:!0,passive:!1}),o.addEventListener("keydown",v,{capture:!0,passive:!1}),n},g=function(){if(i.active)return o.removeEventListener("focusin",h,!0),o.removeEventListener("mousedown",f,!0),o.removeEventListener("touchstart",f,!0),o.removeEventListener("click",m,!0),o.removeEventListener("keydown",v,!0),n};return n={get active(){return i.active},get paused(){return i.paused},activate:function(e){if(i.active)return this;var t=a(e,"onActivate"),n=a(e,"onPostActivate"),r=a(e,"checkCanFocusTrap");r||l(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=o.activeElement,t&&t();var s=function(){r&&l(),b(),n&&n()};return r?(r(i.containers.concat()).then(s,s),this):(s(),this)},deactivate:function(e){if(!i.active)return this;var t=So({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},e);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,g(),i.active=!1,i.paused=!1,Do.deactivateTrap(n);var o=a(t,"onDeactivate"),s=a(t,"onPostDeactivate"),c=a(t,"checkCanReturnFocus"),u=a(t,"returnFocus","returnFocusOnDeactivate");o&&o();var l=function(){Po((function(){u&&d(p(i.nodeFocusedBeforeActivation)),s&&s()}))};return u&&c?(c(p(i.nodeFocusedBeforeActivation)).then(l,l),this):(l(),this)},pause:function(){return i.paused||!i.active||(i.paused=!0,g()),this},unpause:function(){return i.paused&&i.active?(i.paused=!1,l(),b(),this):this},updateContainerElements:function(e){var t=[].concat(e).filter(Boolean);return i.containers=t.map((function(e){return"string"==typeof e?o.querySelector(e):e})),i.active&&l(),this}},n.updateContainerElements(e),n};function Bo(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Ro(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};(t=Object.assign({},this.defaultSettings,t)).reserveScrollBarGap&&this.reserveModalScrollBarGap(e),t.reserveNavScrollBarGap&&this.reserveNavScrollBarGap(e),to(e,{reserveScrollBarGap:!!t.reserveScrollBarGap})},enableBodyScroll:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};(t=Object.assign({},this.defaultSettings,t)).reserveScrollBarGap&&this.restoreModalScrollBarGap(e),t.reserveNavScrollBarGap&&this.restoreNavScrollBarGap(e),oo(e)},onModalOpened:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.disableBodyScroll(e,n),setTimeout((function(){n.disableFocusTrap?e.focus():t.trapFocus(e)}),50)},onModalClosed:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.enableBodyScroll(e,t),this.releaseTrappedFocus(),document.querySelectorAll("[data-modal]").length||no()},trapFocus:function(e){if(this.trappedElement!==e){this.releaseTrappedFocus();var t=No(e,{escapeDeactivates:!1,allowOutsideClick:!0,fallbackFocus:e.querySelector("input:not([type=hidden])")});this.trappedFocus=t.activate(),this.trappedElement=e}},releaseTrappedFocus:function(){this.trappedFocus&&(this.trappedFocus.deactivate(),this.trappedFocus=null,this.trappedElement=null)},alpine:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Ro({name:t,shown:!1,onBeforeHide:!1,onBeforeShow:!1,onHidden:!1,onShown:!1,options:null,init:function(){var e=this,t=this.getScrollable();this.name&&(Livewire.on("openModal",(function(t){if(e.name===t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Ro({init:function(){var e=this,n=this.getScrollable();this.$wire.on("modalClosed",(function(){e.$nextTick((function(){_o.onModalClosed(n,t)}))})),_o.onModalOpened(n,t)},getScrollable:function(){return this.$refs.modal}},e)},reserveModalScrollBarGap:function(e){if(void 0===this.previousPaddingRight){var t=window.innerWidth-document.documentElement.clientWidth;if(t>0){var n=parseInt(window.getComputedStyle(e).getPropertyValue("padding-right"),10);this.previousPaddingRight=e.style.paddingRight,e.style.paddingRight="".concat(n+t,"px")}}},restoreModalScrollBarGap:function(e){void 0!==this.previousPaddingRight&&(e.style.paddingRight=this.previousPaddingRight,this.previousPaddingRight=void 0)},reserveNavScrollBarGap:function(){var e=document.querySelector("header nav");if(void 0===this.previousNavPaddingRight){var t=window.innerWidth-document.documentElement.clientWidth;if(t>0){var n=parseInt(window.getComputedStyle(e).getPropertyValue("padding-right"),10);this.previousNavPaddingRight=e.style.paddingRight,e.style.paddingRight="".concat(n+t,"px")}}},restoreNavScrollBarGap:function(){var e=document.querySelector("header nav");void 0!==this.previousNavPaddingRight&&(e.style.paddingRight=this.previousNavPaddingRight,this.previousNavPaddingRight=void 0)}};const Fo=_o;function Ho(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Wo(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{};return Wo({inverted:!1,invertOnScroll:!1,open:!1,openDropdown:null,selectedChild:null,scrollProgress:0,nav:null,header:null,dark:!1,lockBodyBreakpoint:640,onScroll:function(){var e=this.getScrollProgress();e!==this.scrollProgress&&(this.scrollProgress=e,this.updateStyles(e))},getScrollProgress:function(){var e=document.documentElement.scrollTop,t=this.inverted?20:0,n=this.inverted?50:82;return e=n.top&&o.bottom<=n.bottom&&o.left>=n.left&&o.right<=n.right},disableTabIndexOfInvisibleElements:function(e,t){var n=this;t.forEach((function(t){n.elementIsVisibleIn(e,t)?t.querySelectorAll("[data-custom-tabindex]").forEach((function(e){e.removeAttribute("tabindex"),e.removeAttribute("data-custom-tabindex")})):n.getKeyboardFocusableElements(t).forEach((function(e){e.setAttribute("tabindex","-1"),e.setAttribute("data-custom-tabindex","true")}))}))},setupKeyboardEvents:function(e){e.$el[0].addEventListener("keydown",(function(t){"ArrowRight"===t.code?e.slideNext():"ArrowLeft"===t.code&&e.slidePrev()}))}};const Yo=function(e,t){return{search:!1,page:null,init:function(){var n=this;this.$watch("search",(function(t){t?n.$nextTick((function(){n.$el.querySelectorAll("input[name=".concat(e,"]")).forEach((function(e){e.focus()}))})):n.page=null})),this.$watch("page",(function(e){null!==e&&(e<1&&(n.page=1),e>t&&(n.page=t))}))},blurHandler:function(){this.page||(this.search=!1)},toggleSearch:function(){this.search=!this.search},hideSearch:function(){this.search=!1}}};function Ko(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Xo(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",r=arguments.length>4&&void 0!==arguments[4]&&arguments[4],i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:void 0;return Xo({options:t,onInput:function(e,t){i&&e(i,t.target.value)},getOptionsCount:function(){var e=this;return null!==this.optionsCount||(this.optionsCount=r?Object.keys(this.options).map((function(t){return Object.keys(e.options[t])})).flat().length:Object.keys(this.options).length),this.optionsCount},defaultPopperOptions:{strategy:"fixed",placement:"bottom-end",modifiers:[{name:"preventOverflow"},{name:"offset",options:{offset:[0,8]}}]},optionsCount:null,open:!1,popperInstance:null,selected:null,selectedGroup:null,value:n,text:o,init:function(){var e=this.$el,t=e.querySelector(".dropdown"),n=e.querySelector(".dropdown-button");this.popperInstance=_n(n,t,Xo(Xo({},this.defaultPopperOptions),this.popperOptions||{}))},choose:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.value!==e&&(this.value=e,this.text=null!==t?this.options[t][e]:this.options[e],this.open=!1,this.setHiddenInputValue(e))},setHiddenInputValue:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this.$refs.input;if(n.value=e,t){var o=new Event("input",{bubbles:!0,cancelable:!0});n.dispatchEvent(o)}},onButtonClick:function(){var e,t=this,n=this.$refs.listbox;e=r?this.getAllValues().indexOf(this.value):Object.keys(this.options).indexOf(this.value),this.selected=e>=0?e:0,this.open=!0,this.$nextTick((function(){n.focus(),t.scrollToSelectedOption()}))},onOptionSelect:function(){if(r){var e=this.getAllValues();this.choose(e[this.selected],this.selectedGroup)}else null!==this.selected&&this.choose(Object.keys(this.options)[this.selected]);this.open=!1,this.$refs.button.focus()},onEscape:function(){this.open=!1,this.$refs.button.focus()},onArrowUp:function(){var e=this.getOptionsCount();this.selected=this.selected-1<0?e-1:this.selected-1,this.scrollToSelectedOption()},onArrowDown:function(){var e=this.getOptionsCount();this.selected=this.selected+1>e-1?0:this.selected+1,this.scrollToSelectedOption()},scrollToSelectedOption:function(){var e=this.$refs.listbox.querySelectorAll("[data-option]")[this.selected];r&&(this.selectedGroup=e.dataset.group),e.scrollIntoView({block:"nearest"})},getAllValues:function(){var e=this;return Object.keys(this.options).map((function(t){return Object.keys(e.options[t])})).flat()},getOptionIndex:function(e,t){for(var n=0,o=0;oCookie Policy.')}},necessary_cookies:{title:"Strictly Necessary Cookies",description:"These cookies are essential for the proper functioning of our website and don't store any user-identifiable data. Without these cookies, the website would not work properly. This option cannot be disabled."},analytics:{title:"Performance and Analytics Cookies",description:"These cookies collect information about how you use the website, which pages you visited and which links you clicked on. All of the data is anonymized and cannot be used to identify you.",analytics_description:"This cookie is installed by Google Analytics and used for the site’s analytics report. This information is stored anonymously and assigned a random number to identify unique visitors.",session_description:"This cookie is installed by Google Analytics for session management."},footer:{title:"More Information",description:function(e){return'For any queries in relation to our policy on cookies and your choices, please contact us.')}}}}}},cookieConsent:null,disableOutsideClick:function(){return this.options.disableOutsideClick=!0,this},overlayCrossButton:function(){return this.options.overlayCrossButton=!0,this},withtrackingAnalytics:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return this.options.trackingAnalytics={key:e,domain:t},this},withLocale:function(e){return this.options.locale=e,this},withLang:function(e){return this.options.lang=e,this},showSettings:function(){this.cookieConsent.showSettings()},init:function(e){var t,n,o=this,r=e.appName,i=e.domain,a=e.contactUrl;this.cookieConsent=initCookieConsent(null,this.options),this.options.trackingAnalytics&&(t=function(){var e=document.createElement("script");function t(){dataLayer.push(arguments)}e.id="google_analytics_script",e.type="text/javascript",e.src="https://www.googletagmanager.com/gtag/js?id=".concat(o.options.trackingAnalytics.key),document.body.append(e),window.dataLayer=window.dataLayer||[],t("js",new Date),t("config",o.options.trackingAnalytics.key)},n=function(){document.getElementById("google_analytics_script").remove();var e=document.cookie.split(";").filter((function(e){return e.trim().startsWith("_ga")})).map((function(e){return e.split("=")[0]})),t=o.options.trackingAnalytics.domain||document.domain;o.cookieConsent.eraseCookies(e,"/",t),window["ga-disable-".concat(o.options.trackingAnalytics.key)]=!0});var s={current_lang:this.options.locale,languages:{en:{consent_modal:{title:this.options.lang.consentModal.title,description:this.options.lang.consentModal.description,primary_btn:{text:this.options.lang.consentModal.primaryBtn.text,role:"accept_all"},secondary_btn:{text:this.options.lang.consentModal.secondaryBtn.text,role:"accept_necessary"}},settings_modal:{title:this.options.lang.settingsModal.title,save_settings_btn:this.options.lang.settingsModal.save_settings_btn,accept_all_btn:this.options.lang.settingsModal.accept_all_btn,reject_all_btn:this.options.lang.settingsModal.reject_all_btn,close_btn_label:this.options.lang.settingsModal.close_btn_label,cookie_table_headers:[{col1:this.options.lang.settingsModal.cookie_table_headers.name},{col2:this.options.lang.settingsModal.cookie_table_headers.domain},{col3:this.options.lang.settingsModal.cookie_table_headers.description}],blocks:[{title:this.options.lang.settingsModal.blocks.header.title,description:this.options.lang.settingsModal.blocks.header.description(r)},{title:this.options.lang.settingsModal.blocks.necessary_cookies.title,description:this.options.lang.settingsModal.blocks.necessary_cookies.description,toggle:{value:"necessary",enabled:!0,readonly:!0}},{title:this.options.lang.settingsModal.blocks.analytics.title,description:this.options.lang.settingsModal.blocks.analytics.description,toggle:{value:"analytics",enabled:!1,readonly:!1},cookie_table:[{col1:"^_ga",col2:i,col3:this.options.lang.settingsModal.blocks.analytics.analytics_description},{col1:"_ga_".concat(this.options.trackingAnalytics.key),col2:i,col3:this.options.lang.settingsModal.blocks.analytics.session_description}]},{title:this.options.lang.settingsModal.blocks.footer.title,description:this.options.lang.settingsModal.blocks.footer.description(a)}]}}},gui_options:{consent_modal:{layout:"cloud",position:"bottom center",transition:"slide"},settings_modal:{layout:"box",transition:"slide"}}};this.options.trackingAnalytics&&(s.onAccept=function(e){e.categories.includes("analytics")&&t()},s.onChange=function(e){e.categories.includes("analytics")?t():n()}),this.cookieConsent.run(s);var c=document.getElementById("c-txt");c&&c.insertAdjacentHTML("beforeend",' ')}};n(250),n(202);window.Alpine=o.Z,window.Dropdown=Vn,window.Modal=Fo,window.Navbar=Uo,window.Slider=zo,window.Pagination=Yo,window.RichSelect=Jo,window.Slider=zo,window.FileUpload=er(),window.CookieBanner=tr,o.Z.start()},859:()=>{window.uploadPhoto=function(e){return{url:e.url,onUpload:e.onUpload,upload:function(e){var t=this;if(e.target.files.length){var n=new FormData;n.append("logo",e.target.files[0]),fetch(this.url,{method:"POST",body:n}).then((function(){return t.onUpload()}))}},select:function(){document.getElementById("photo").click()}}}},471:()=>{function e(e,n){var o="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!o){if(Array.isArray(e)||(o=function(e,n){if(!e)return;if("string"==typeof e)return t(e,n);var o=Object.prototype.toString.call(e).slice(8,-1);"Object"===o&&e.constructor&&(o=e.constructor.name);if("Map"===o||"Set"===o)return Array.from(e);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return t(e,n)}(e))||n&&e&&"number"==typeof e.length){o&&(e=o);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,s=!0,c=!1;return{s:function(){o=o.call(e)},n:function(){var e=o.next();return s=e.done,e},e:function(e){c=!0,a=e},f:function(){try{s||null==o.return||o.return()}finally{if(c)throw a}}}}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);ndocument.body.clientHeight&&(i.style="display: none; margin-top: -"+(a-document.body.clientHeight+20)+"px")}}}}catch(e){n.e(e)}finally{n.f()}}))},250:()=>{function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function t(t){for(var o=1;o0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){};return t({selected:e,select:function(e){this.selected=e,this.$refs[e].focus(),this.onSelected(e)},keyboard:function(e){var t=e.target.closest("[role=tablist]").querySelectorAll("[role=tab]"),n=Array.prototype.indexOf.call(t,e.currentTarget),o=37===e.keyCode?n-1:39===e.keyCode?n+1:40===e.keyCode?"down":null;null!==o&&("down"===o?this.select(e.currentTarget.id.replace("tab-","")):t[o]&&this.select(t[o].id.replace("tab-","")))},onSelected:o},n)}},607:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var o=n(645),r=n.n(o)()((function(e){return e[1]}));r.push([e.id,'.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{background-color:#333;border-radius:4px;color:#fff;font-size:14px;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{color:#333;height:16px;width:16px}.tippy-arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.tippy-content{padding:5px 9px;position:relative;z-index:1}',""]);const i=r},645:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,o){"string"==typeof e&&(e=[[null,e,""]]);var r={};if(o)for(var i=0;i{},379:(e,t,n)=>{"use strict";var o,r=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),a=[];function s(e){for(var t=-1,n=0;n{var t=t=>e(e.s=t);e.O(0,[170,898],(()=>(t(368),t(81))));e.O()}]); \ No newline at end of file diff --git a/public/js/app.js.LICENSE b/public/js/app.js.LICENSE new file mode 100644 index 0000000..e56a96c --- /dev/null +++ b/public/js/app.js.LICENSE @@ -0,0 +1,5 @@ +/*! + * Vue.js v2.6.11 + * (c) 2014-2019 Evan You + * Released under the MIT License. + */ diff --git a/public/js/app.js.LICENSE.txt b/public/js/app.js.LICENSE.txt new file mode 100644 index 0000000..0812e4a --- /dev/null +++ b/public/js/app.js.LICENSE.txt @@ -0,0 +1,4 @@ +/*! +* focus-trap 6.9.4 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/ diff --git a/public/js/clipboard.js b/public/js/clipboard.js new file mode 100644 index 0000000..418ea61 --- /dev/null +++ b/public/js/clipboard.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[934],{619:()=>{window.clipboard=function(){return{copying:!1,notSupported:!1,copy:function(e){var t=this;this.copying=!0;var n=window.navigator.clipboard;n&&window.isSecureContext?n.writeText(e).then((function(){return t.copying=!1}),(function(){t.copying=!1,console.error("Failed to copy contents to the clipboard.")})):(console.warn("Using fallback due to lack of navigator support or HTTPS in this browser"),this.copyUsingExec(e))},copyUsingExec:function(e){var t=this,n=document.createElement("textarea");if(n.value=e,n.setAttribute("readonly",""),n.style.cssText="position:absolute;top:0;left:0;z-index:-9999;opacity:0;fontSize:12pt;",this.$root.append(n),navigator.userAgent.match(/ipad|iphone/i)){var o=n.contentEditable,i=n.readOnly;n.contentEditable="true",n.readOnly=!1;var c=document.createRange();c.selectNodeContents(n);var a=window.getSelection();a&&(a.removeAllRanges(),a.addRange(c)),n.setSelectionRange(0,999999),n.contentEditable=o,n.readOnly=i}else n.select(),n.focus();this.copying=!0,setTimeout((function(){return t.copying=!1}),1200),document.execCommand("copy"),n.remove()},copyFromInput:function(e){var t=document.querySelector(e);this.copy(t.value)}}}}},e=>{var t;t=619,e(e.s=t)}]); \ No newline at end of file diff --git a/public/js/cookie-consent.js b/public/js/cookie-consent.js new file mode 100644 index 0000000..0c6069c --- /dev/null +++ b/public/js/cookie-consent.js @@ -0,0 +1,2 @@ +/*! For license information please see cookie-consent.js.LICENSE.txt */ +(self.webpackChunk=self.webpackChunk||[]).push([[252],{557:()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}!function(){"use strict";var t="initCookieConsent";"function"!=typeof window[t]&&(window[t]=function(t){var n,o,i,a,c,r,s,l,d,u,p,f,g,h,v,m,_,b,y,k,C,A,w,x,S,N,T,L,O,E,j=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},M=!1,H={mode:"opt-in",current_lang:"en",auto_language:null,autorun:!0,page_scripts:!0,hide_from_bots:!0,cookie_name:"cc_cookie",cookie_expiration:365,cookie_domain:window.location.hostname,avoid_explicit_domain:!0,cookie_path:"/",cookie_same_site:"Lax",use_rfc_cookie:!0,autoclear_cookies:!0,revision:0,script_selector:"data-cookiecategory"},I={},D={},J=null,G=!1,P=!1,U=!1,q=!1,F=!1,R=!1,z=!0,B="",K=[],V=!1,$=[],Q=[],W=[],X=!1,Y=[],Z=[],ee=[],te=[],ne=[],oe=document.documentElement,ie=function(e){ge("CookieConsent [CONFIG]: received_config_settings ",n=e),"number"==typeof n.cookie_expiration&&(H.cookie_expiration=n.cookie_expiration),"number"==typeof n.cookie_necessary_only_expiration&&(H.cookie_necessary_only_expiration=n.cookie_necessary_only_expiration),"boolean"==typeof n.autorun&&(H.autorun=n.autorun),"string"==typeof n.cookie_domain&&(H.cookie_domain=n.cookie_domain),"boolean"==typeof n.avoid_explicit_domain&&(H.avoid_explicit_domain=n.avoid_explicit_domain),"string"==typeof n.cookie_same_site&&(H.cookie_same_site=n.cookie_same_site),"string"==typeof n.cookie_path&&(H.cookie_path=n.cookie_path),"string"==typeof n.cookie_name&&(H.cookie_name=n.cookie_name),"function"==typeof n.onAccept&&(c=n.onAccept),"function"==typeof n.onFirstAction&&(s=n.onFirstAction),"function"==typeof n.onChange&&(r=n.onChange),"opt-out"===n.mode&&(H.mode="opt-out"),"number"==typeof n.revision&&(n.revision>-1&&(H.revision=n.revision),R=!0),"boolean"==typeof n.autoclear_cookies&&(H.autoclear_cookies=n.autoclear_cookies),!0===n.use_rfc_cookie&&(H.use_rfc_cookie=!0),!0===n.hide_from_bots&&(X=navigator&&(navigator.userAgent&&/bot|crawl|spider|slurp|teoma/i.test(navigator.userAgent)||navigator.webdriver)),H.page_scripts=!0===n.page_scripts,"browser"===n.auto_language||!0===n.auto_language?H.auto_language="browser":"document"===n.auto_language&&(H.auto_language="document"),ge("CookieConsent [LANG]: auto_language strategy is '"+H.auto_language+"'"),H.current_lang=ve(n.languages,n.current_lang)},ae=function(e){for(var t="accept-",n=r("c-settings"),o=r(t+"all"),i=r(t+"necessary"),a=r(t+"custom"),c=0;c0?Object.prototype.hasOwnProperty.call(t,H.current_lang)?H.current_lang:Te(t)[0]:void 0},re=function(){var e=["[href]","button","input","details",'[tabindex="0"]'];function t(t,n){var o=!1,i=!1;try{for(var a,c=t.querySelectorAll(e.join(':not([tabindex="-1"]), ')),r=c.length,s=0;s-1?(U.checked=!0,!N&&ee.push(!0)):!N&&ee.push(!1):g.enabled?(U.checked=!0,!N&&ee.push(!0),g.enabled&&!N&&W.push(B)):!N&&ee.push(!1),!N&&te.push(B),g.readonly?(U.disabled=!0,Le(q,"c-ro"),!N&&ne.push(!0)):!N&&ne.push(!1),Le(b,"b-acc"),Le(M,"b-bn"),Le(_,"b-ex"),b.id=H,b.setAttribute("aria-hidden","true"),P.appendChild(U),P.appendChild(q),P.appendChild(F),M.appendChild(P),m&&function(e,t,n){Ne(J,"click",(function(){Ee(t,"act")?(Oe(t,"act"),n.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")):(Le(t,"act"),n.setAttribute("aria-expanded","true"),e.setAttribute("aria-hidden","false"))}),!1)}(b,_,J)}else if(u){var K=he("div");K.className="b-tl",K.setAttribute("role","heading"),K.setAttribute("aria-level","3"),K.insertAdjacentHTML("beforeend",u),M.appendChild(K)}if(u&&_.appendChild(M),p&&b.appendChild(y),!v&&void 0!==h){for(var V=document.createDocumentFragment(),$=0;$

\x3c!--\x3e
\x3c!---1;if(!ee[++n]&&Object.prototype.hasOwnProperty.call(l,"cookie_table")&&(e||d)){var u=l.cookie_table,p=Te(i[0])[0],f=u.length;"on_disable"===l.toggle.reload&&d&&(V=!0);for(var g=0;g-1&&v.push(o[C])}ge("CookieConsent [AUTOCLEAR]: search cookie: '"+m+"', found:",v),v.length>0&&(Se(v,y,c),"on_clear"===l.toggle.reload&&(V=!0))}}}}},pe=function(e){K=[];var t=document.querySelectorAll(".c-tgl")||[];if(t.length>0)for(var n=0;n0&&ue(),D={categories:e,revision:H.revision,data:J,rfc_cookie:H.use_rfc_cookie},(!G||K.length>0||!z)&&(z=!0,l=Ae(Ce()),we(H.cookie_name,JSON.stringify(D)),ye()),(G||(H.autoclear_cookies&&ue(!0),"function"==typeof s&&s(I.getUserPreferences(),D),"function"==typeof c&&c(D),G=!0,"opt-in"!==H.mode))&&("function"==typeof r&&K.length>0&&r(D,K),V&&window.location.reload())},fe=function(e,t){return e.indexOf(t)},ge=function(e,t,n){M&&(n?console.error(e,t||""):console.log(e,void 0!==t?t:" "))},he=function(e){var t=document.createElement(e);return"button"===e&&t.setAttribute("type",e),t},ve=function(e,t){return"browser"===H.auto_language?ce(me(),e):"document"===H.auto_language?ce(document.documentElement.lang,e):"string"==typeof t?H.current_lang=ce(t,e):(ge("CookieConsent [LANG]: setting current_lang = '"+H.current_lang+"'"),H.current_lang)},me=function(){var e=navigator.language||navigator.browserLanguage;return e.length>2&&(e=e[0]+e[1]),ge("CookieConsent [LANG]: detected_browser_lang = '"+e+"'"),e.toLowerCase()},_e=function(){var e=!1,t=!1;Ne(document,"keydown",(function(n){"Tab"===(n=n||window.event).key&&(o&&(n.shiftKey?document.activeElement===o[0]&&(o[1].focus(),n.preventDefault()):document.activeElement===o[1]&&(o[0].focus(),n.preventDefault()),t||F||(t=!0,!e&&n.preventDefault(),n.shiftKey?o[3]?o[2]?o[2].focus():o[0].focus():o[1].focus():o[3]?o[3].focus():o[0].focus())),!t&&(e=!0))})),document.contains&&!j.disableOutsideClick&&Ne(p,"click",(function(e){e=e||window.event,q?C.contains(e.target)?F=!0:(I.hideSettings(0),F=!1):U&&g.contains(e.target)&&(F=!0)}),!0)},be=function(t,n){if("object"===e(t)){var o=t.consent_modal,i=t.settings_modal;P&&o&&a(g,["box","bar","cloud"],["top","middle","bottom"],["zoom","slide"],o.layout,o.position,o.transition),!n&&i&&a(k,["bar"],["left","right"],["zoom","slide"],i.layout,i.position,i.transition)}function a(e,t,n,o,i,a,c){if(a=a&&a.split(" ")||[],fe(t,i)>-1&&(Le(e,i),("bar"!==i||"middle"!==a[0])&&fe(n,a[0])>-1))for(var r=0;r-1&&Le(e,c)}};I.allowedCategory=function(e){if(G||"opt-in"===H.mode)var t=JSON.parse(xe(H.cookie_name,"one",!0)||"{}").categories||[];else t=W;return fe(t,e)>-1},I.run=function(e){if(document.getElementById("cc_div"))ge("CookieConsent [NOTICE]: cookie consent already attached to body!");else{if(ie(e),X)return;if(void 0!==(D=JSON.parse(xe(H.cookie_name,"one",!0)||"{}")).level&&(D.categories=D.level,delete D.level,Se([H.cookie_name],"/",[H.cookie_domain,"."+H.cookie_domain]),we(H.cookie_name,JSON.stringify(D))),G=void 0!==D.categories,J=void 0!==D.data?D.data:null,z=!("number"==typeof e.revision&&G&&e.revision>-1&&D.revision!==H.revision),P=!G||!z,de(),re(),be(e.gui_options),ae(),H.autorun&&P&&I.show(e.delay||0),setTimeout((function(){Le(p,"c--anim")}),30),setTimeout((function(){_e()}),100),G&&z){var t="boolean"==typeof D.rfc_cookie;(!t||t&&D.rfc_cookie!==H.use_rfc_cookie)&&(D.rfc_cookie=H.use_rfc_cookie,we(H.cookie_name,JSON.stringify(D))),l=Ae(Ce()),ye(),"function"==typeof c&&c(D)}else"opt-out"===H.mode&&(ge("CookieConsent [CONFIG] mode='"+H.mode+"', default enabled categories:",W),ye(W))}},I.showSettings=function(e){setTimeout((function(){Le(oe,"show--settings"),k.setAttribute("aria-hidden","false"),x.removeAttribute("style"),q=!0,setTimeout((function(){U?u=document.activeElement:d=document.activeElement,0!==Z.length&&(Z[3]?Z[3].focus():Z[0].focus(),o=Z)}),200),ge("CookieConsent [SETTINGS]: show settings_modal")}),e>0?e:0)};var ye=function(e){if(H.page_scripts){var t=document.querySelectorAll("script["+H.script_selector+"]"),n=e||D.categories||[];!function e(t,o){if(o-1){i.type="text/javascript",i.removeAttribute(H.script_selector);var c=i.getAttribute("data-src");c&&i.removeAttribute("data-src");var r=he("script");if(r.textContent=i.innerHTML,function(e,t){for(var n=t.attributes,o=n.length,i=0;i0)for(var a=0;a0?e:t?30:0)},I.hide=function(){P&&(Oe(oe,"show--consent"),g.setAttribute("aria-hidden","true"),U=!1,setTimeout((function(){d.focus(),o=null}),200),ge("CookieConsent [MODAL]: hide"))},I.hideSettings=function(){Oe(oe,"show--settings"),q=!1,k.setAttribute("aria-hidden","true"),x.style="display: none",setTimeout((function(){U?(u&&u.focus(),o=Y):(d&&d.focus(),o=null),F=!1}),200),ge("CookieConsent [SETTINGS]: hide settings_modal")},I.accept=function(t,n){var o=t||void 0,i=n||[],a=[];if(o)if("object"===e(o)&&"number"==typeof o.length)for(var c=0;c=1)for(c=0;c0)for(var c=0;c-1;a&&c&&(i+=" Domain="+H.cookie_domain+";"),"https:"===window.location.protocol&&(i+=" Secure;"),document.cookie=i,ge("CookieConsent [SET_COOKIE]: cookie "+e+"='"+t+"' was set! Expires after "+n+" days")},xe=function(e,t,n){var o;if("one"===t){if((o=(o=document.cookie.match("(^|;)\\s*"+e+"\\s*=\\s*([^;]+)"))?n?o.pop():e:"")&&e===H.cookie_name){try{o=JSON.parse(o)}catch(e){try{o=JSON.parse(decodeURIComponent(o))}catch(e){o={}}}o=JSON.stringify(o)}}else if("all"===t){var i=document.cookie.split(/;\s*/);o=[];for(var a=0;a-1?"; domain="+n[a]:"")+"; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";ge("CookieConsent [AUTOCLEAR]: deleting cookie: '"+e[i]+"' path: '"+o+"' domain:",n)}};I.validCookie=function(e){return""!==xe(e,"one",!0)};var Ne=function(e,t,n,o){var i=!0===o;e.addEventListener?i?e.addEventListener(t,n,{passive:!0}):e.addEventListener(t,n,!1):e.attachEvent("on"+t,n)},Te=function(t){if("object"===e(t)){var n=[],o=0;for(var i in t)n[o++]=i;return n}},Le=function(e,t){e.classList?e.classList.add(t):Ee(e,t)||(e.className+=" "+t)},Oe=function(e,t){e.classList?e.classList.remove(t):e.className=e.className.replace(new RegExp("(\\s|^)"+t+"(\\s|$)")," ")},Ee=function(e,t){return e.classList?e.classList.contains(t):!!e.className.match(new RegExp("(\\s|^)"+t+"(\\s|$)"))};return I})}()}},e=>{var t;t=557,e(e.s=t)}]); \ No newline at end of file diff --git a/public/js/cookie-consent.js.LICENSE.txt b/public/js/cookie-consent.js.LICENSE.txt new file mode 100644 index 0000000..6747992 --- /dev/null +++ b/public/js/cookie-consent.js.LICENSE.txt @@ -0,0 +1,8 @@ +/*! + * CookieConsent v3.0.0-beta.1 + * https://www.github.com/orestbida/cookieconsent + * Author Orest Bida + * Released under the MIT License + * + * This is a copy of https://www.github.com/orestbida/cookieconsent with minor adjustments for ARK.io-related projects + */ diff --git a/public/js/crop-image.js b/public/js/crop-image.js new file mode 100644 index 0000000..0409ccb --- /dev/null +++ b/public/js/crop-image.js @@ -0,0 +1,2 @@ +/*! For license information please see crop-image.js.LICENSE.txt */ +(self.webpackChunk=self.webpackChunk||[]).push([[765],{961:(t,e,i)=>{"use strict";var a=i(379),n=i.n(a),r=i(722),o={insert:"head",singleton:!1};n()(r.Z,o);r.Z.locals;var h=i(129),s=i.n(h),c=i(144),l=function(t){throw new Error(t||"Received invalid response")};function p(t){return function(t){if(Array.isArray(t))return d(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return d(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);"Object"===i&&t.constructor&&(i=t.constructor.name);if("Map"===i||"Set"===i)return Array.from(t);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return d(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,a=new Array(e);i0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:200,o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:200,h=arguments.length>7&&void 0!==arguments[7]?arguments[7]:1e3,d=arguments.length>8&&void 0!==arguments[8]?arguments[8]:1e3,g=arguments.length>9&&void 0!==arguments[9]?arguments[9]:900,m=arguments.length>10&&void 0!==arguments[10]?arguments[10]:900,f=arguments.length>11&&void 0!==arguments[11]?arguments[11]:2,v=arguments.length>12&&void 0!==arguments[12]?arguments[12]:"#fff",w=!(arguments.length>13&&void 0!==arguments[13])||arguments[13],b=arguments.length>14&&void 0!==arguments[14]?arguments[14]:"high",y=arguments.length>15&&void 0!==arguments[15]?arguments[15]:"/cropper/upload-image";return{model:e,cropper:null,isUploading:!1,isPreparingImage:!0,isCropping:!1,uploadEl:null,cropEl:null,modalCancelButton:null,modalSaveButton:null,cropElementIsReady:function(){var t=this;return new Promise((function(e,i){var a=function(){var i=setInterval((function(){t.cropEl.parentNode.clientHeight?(clearInterval(i),e()):u("tries")}),50)};t.cropEl.complete?a():t.cropEl.onload=function(){return a()}}))},init:function(){var e=this;this.uploadEl=document.getElementById(i),Livewire.on("discardCroppedImage",(function(){Livewire.emit("closeModal",n),e.discardImage()})),Livewire.on("saveCroppedImage",(function(){Livewire.emit("closeModal",n),e.saveCroppedImage(),e.discardImage()})),Livewire.on("cropModalShown",(function(i){"crop-modal-".concat(i)===n&&e.cropElementIsReady().then((function(){e.isPreparingImage=!1,e.$nextTick((function(){e.cropper=new(s())(e.cropEl,t)}))}))})),Livewire.on("cropModalBeforeHide",(function(t){"crop-modal-".concat(t)===n&&e.destroyCropper()}))},destroyCropper:function(){this.cropper&&(this.cropper.destroy(),this.cropper=null)},select:function(){this.uploadEl.click()},validateImage:function(){var t=this;this.uploadEl.files.length&&(0,c.ck)(this.uploadEl.files[0],[{rule:"minWidth",value:r},{rule:"maxWidth",value:h},{rule:"minHeight",value:o},{rule:"maxHeight",value:d},{rule:"maxFileSize",value:f}]).then((function(){t.loadCropper()})).catch((function(e){(0,c.HN)(t.uploadEl),Object.values(e.getAll()).forEach((function(t){p(t).forEach((function(t){var e=t.value;return Livewire.emit("toastMessage",[e,"danger"])}))}))}))},loadCropper:function(){var t=this;if(this.uploadEl.files.length){this.isPreparingImage=!0;var e=new FileReader;e.onload=function(e){e.target.result&&(t.cropEl=document.getElementById(a),t.cropEl.src=e.target.result)},e.readAsDataURL(this.uploadEl.files[0]),this.openCropModal()}},saveCroppedImage:function(){var t=this;if(this.cropper){var e=this.cropper.getCroppedCanvas({width:g,height:m,fillColor:v,imageSmoothingEnabled:w,imageSmoothingQuality:b});e&&e.toBlob((function(e){(0,c.Ix)(e,y,(0,c._V)()).then((function(e){e.url||l(),t.model=e.url}))}))}},discardImage:function(){this.destroyCropper(),(0,c.HN)(this.uploadEl)},openCropModal:function(){Livewire.emit("openModal",n)}}}},144:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Ix:()=>uploadImage,ck:()=>imageValidator,_V:()=>getCsrfToken,HN:()=>resetUploadInput});var _utils_error_bag__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(981),uploadImage=function(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"image",n=new FormData;return n.append(a,t),fetch(e,{method:"POST",body:n,headers:{"X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":i}}).then((function(t){var e=t.status;if(200===e)return t.json();if(419===e)throw new Error("Session expired. You will need to refresh the browser to continue uploading images.");t.text().then((function(t){throw new Error(t)}))})).catch((function(t){throw new Error(t)}))},imageValidator=function imageValidator(inputFile){var rules=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],errorBag=new _utils_error_bag__WEBPACK_IMPORTED_MODULE_0__.Z(inputFile.name),image=new Image,ruleset=["minWidth","maxWidth","minHeight","maxHeight","minFileSize","maxFileSize"],minWidth=function(t,e){t.widthe&&errorBag.add(getCallerName(),"The image should be no bigger than ".concat(e,"x").concat(e,"px"))},maxHeight=function(t,e){t.height>e&&errorBag.add(getCallerName(),"The image should be no bigger than ".concat(e,"x").concat(e,"px"))},minFileSize=function(t,e){bytesToMegabytes(t.size)e&&errorBag.add(getCallerName(),"The image should be no bigger than ".concat(e,"MB"))};return image.src=URL.createObjectURL(inputFile),image.size=inputFile.size,new Promise((function(resolve,reject){image.onload=function(e){rules.forEach((function(item){item.hasOwnProperty("rule")&&ruleset.includes(item.rule)&&eval(item.rule)(e.target,parseInt(item.value))})),errorBag.hasErrors()&&reject(errorBag),resolve()}}))},getCallerName=function(){return(new Error).stack.split("\n")[2].replace(/^\s+at\s+(.+?)\s.+/g,"$1")},bytesToMegabytes=function(t){return parseFloat("".concat(parseInt(t)/1e3/1e3)).toFixed(2)},getCsrfToken=function(){return document.querySelector("meta[name=csrf-token]").content},resetUploadInput=function(t){t.value="",t.type="",t.type="file"}},981:(t,e,i)=>{"use strict";function a(t){return function(t){if(Array.isArray(t))return n(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return n(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);"Object"===i&&t.constructor&&(i=t.constructor.name);if("Map"===i||"Set"===i)return Array.from(t);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return n(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,a=new Array(e);ih});var h=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;r(this,t),this.defaultBagName="default",this.collection={},e||(this.defaultBagName=e)}var e,i,n;return e=t,i=[{key:"add",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.defaultBagName;t||e?(this.collection.hasOwnProperty(i)||(this.collection[i]=[]),this.addItem(t,e,i)):this.collection[i]=[]}},{key:"reset",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.defaultBagName;this.add(t)}},{key:"get",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.defaultBagName;return t?this.collection[e].find((function(e){return e.key===t})):this.getBag(e)}},{key:"hasErrors",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.defaultBagName;return this.hasBag(t)&&this.getBag(t).length>0}},{key:"remove",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.defaultBagName;if(t){var i=this.collection[e];i.splice(i.findIndex((function(e){return e.key===t})),1)}else delete this.collection[e]}},{key:"getAll",value:function(){return this.collection}},{key:"resetAll",value:function(){this.collection={}}},{key:"unify",value:function(){var e={};return Object.entries(this.collection).forEach((function(t){a(t).forEach((function(i){for(var a,n=0,r=i.map((function(t){return Object.assign({},t)})),o=[];n-1?r.splice(n,1):o.push(a),n++;e[t[0]]=r}))})),this.collection=e,t}},{key:"hasBag",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.defaultBagName;return this.collection.hasOwnProperty(t)}},{key:"getBag",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.defaultBagName;return this.collection[t]}},{key:"addItem",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.defaultBagName;this.collection[i].push(this.errorItem(t,e))}},{key:"errorItem",value:function(t,e){return{key:t,value:e}}}],i&&o(e.prototype,i),n&&o(e,n),t}()},129:function(t){t.exports=function(){"use strict";function t(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,a)}return i}function e(e){for(var i=1;it.length)&&(e=t.length);for(var i=0,a=new Array(e);i
',dt=Number.isNaN||g.isNaN;function ut(t){return"number"==typeof t&&!dt(t)}var gt=function(t){return t>0&&t<1/0};function mt(t){return void 0===t}function ft(t){return"object"===i(t)&&null!==t}var vt=Object.prototype.hasOwnProperty;function wt(t){if(!ft(t))return!1;try{var e=t.constructor,i=e.prototype;return e&&i&&vt.call(i,"isPrototypeOf")}catch(t){return!1}}function bt(t){return"function"==typeof t}var yt=Array.prototype.slice;function xt(t){return Array.from?Array.from(t):yt.call(t)}function Mt(t,e){return t&&bt(e)&&(Array.isArray(t)||ut(t.length)?xt(t).forEach((function(i,a){e.call(t,i,a,t)})):ft(t)&&Object.keys(t).forEach((function(i){e.call(t,t[i],i,t)}))),t}var Ct=Object.assign||function(t){for(var e=arguments.length,i=new Array(e>1?e-1:0),a=1;a0&&i.forEach((function(e){ft(e)&&Object.keys(e).forEach((function(i){t[i]=e[i]}))})),t},kt=/\.\d*(?:0|9){12}\d*$/;function Bt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e11;return kt.test(t)?Math.round(t*e)/e:t}var Dt=/^width|height|left|top|marginLeft|marginTop$/;function Et(t,e){var i=t.style;Mt(e,(function(t,e){Dt.test(e)&&ut(t)&&(t="".concat(t,"px")),i[e]=t}))}function At(t,e){return t.classList?t.classList.contains(e):t.className.indexOf(e)>-1}function Tt(t,e){if(e)if(ut(t.length))Mt(t,(function(t){Tt(t,e)}));else if(t.classList)t.classList.add(e);else{var i=t.className.trim();i?i.indexOf(e)<0&&(t.className="".concat(i," ").concat(e)):t.className=e}}function Ot(t,e){e&&(ut(t.length)?Mt(t,(function(t){Ot(t,e)})):t.classList?t.classList.remove(e):t.className.indexOf(e)>=0&&(t.className=t.className.replace(e,"")))}function Nt(t,e,i){e&&(ut(t.length)?Mt(t,(function(t){Nt(t,e,i)})):i?Tt(t,e):Ot(t,e))}var Ht=/([a-z\d])([A-Z])/g;function St(t){return t.replace(Ht,"$1-$2").toLowerCase()}function It(t,e){return ft(t[e])?t[e]:t.dataset?t.dataset[e]:t.getAttribute("data-".concat(St(e)))}function zt(t,e,i){ft(i)?t[e]=i:t.dataset?t.dataset[e]=i:t.setAttribute("data-".concat(St(e)),i)}function Wt(t,e){if(ft(t[e]))try{delete t[e]}catch(i){t[e]=void 0}else if(t.dataset)try{delete t.dataset[e]}catch(i){t.dataset[e]=void 0}else t.removeAttribute("data-".concat(St(e)))}var Lt=/\s\s*/,Rt=function(){var t=!1;if(u){var e=!1,i=function(){},a=Object.defineProperty({},"once",{get:function(){return t=!0,e},set:function(t){e=t}});g.addEventListener("test",i,a),g.removeEventListener("test",i,a)}return t}();function jt(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(Lt).forEach((function(e){if(!Rt){var r=t.listeners;r&&r[e]&&r[e][i]&&(n=r[e][i],delete r[e][i],0===Object.keys(r[e]).length&&delete r[e],0===Object.keys(r).length&&delete t.listeners)}t.removeEventListener(e,n,a)}))}function _t(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(Lt).forEach((function(e){if(a.once&&!Rt){var r=t.listeners,o=void 0===r?{}:r;n=function(){delete o[e][i],t.removeEventListener(e,n,a);for(var r=arguments.length,h=new Array(r),s=0;sMath.abs(a)&&(a=s)}))})),a}function Vt(t,i){var a=t.pageX,n=t.pageY,r={endX:a,endY:n};return i?r:e({startX:a,startY:n},r)}function $t(t){var e=0,i=0,a=0;return Mt(t,(function(t){var n=t.startX,r=t.startY;e+=n,i+=r,a+=1})),{pageX:e/=a,pageY:i/=a}}function Kt(t){var e=t.aspectRatio,i=t.height,a=t.width,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"contain",r=gt(a),o=gt(i);if(r&&o){var h=i*e;"contain"===n&&h>a||"cover"===n&&h90?{width:s,height:h}:{width:h,height:s}}function Jt(t,e,i,a){var n=e.aspectRatio,r=e.naturalWidth,o=e.naturalHeight,s=e.rotate,c=void 0===s?0:s,l=e.scaleX,p=void 0===l?1:l,d=e.scaleY,u=void 0===d?1:d,g=i.aspectRatio,m=i.naturalWidth,f=i.naturalHeight,v=a.fillColor,w=void 0===v?"transparent":v,b=a.imageSmoothingEnabled,y=void 0===b||b,x=a.imageSmoothingQuality,M=void 0===x?"low":x,C=a.maxWidth,k=void 0===C?1/0:C,B=a.maxHeight,D=void 0===B?1/0:B,E=a.minWidth,A=void 0===E?0:E,T=a.minHeight,O=void 0===T?0:T,N=document.createElement("canvas"),H=N.getContext("2d"),S=Kt({aspectRatio:g,width:k,height:D}),I=Kt({aspectRatio:g,width:A,height:O},"cover"),z=Math.min(S.width,Math.max(I.width,m)),W=Math.min(S.height,Math.max(I.height,f)),L=Kt({aspectRatio:n,width:k,height:D}),R=Kt({aspectRatio:n,width:A,height:O},"cover"),j=Math.min(L.width,Math.max(R.width,r)),_=Math.min(L.height,Math.max(R.height,o)),X=[-j/2,-_/2,j,_];return N.width=Bt(z),N.height=Bt(W),H.fillStyle=w,H.fillRect(0,0,z,W),H.save(),H.translate(z/2,W/2),H.rotate(c*Math.PI/180),H.scale(p,u),H.imageSmoothingEnabled=y,H.imageSmoothingQuality=M,H.drawImage.apply(H,[t].concat(h(X.map((function(t){return Math.floor(Bt(t))}))))),H.restore(),N}var te=String.fromCharCode;function ee(t,e,i){var a="";i+=e;for(var n=e;n0;)i.push(te.apply(null,xt(n.subarray(0,a)))),n=n.subarray(a);return"data:".concat(e,";base64,").concat(btoa(i.join("")))}function re(t){var e,i=new DataView(t);try{var a,n,r;if(255===i.getUint8(0)&&216===i.getUint8(1))for(var o=i.byteLength,h=2;h+1=8&&(r=s+l)}}}if(r){var p,d,u=i.getUint16(r,a);for(d=0;d=0?n:st),height:Math.max(i.offsetHeight,r>=0?r:ct)};this.containerData=o,Et(a,{width:o.width,height:o.height}),Tt(t,H),Ot(a,H)},initCanvas:function(){var t=this.containerData,e=this.imageData,i=this.options.viewMode,a=Math.abs(e.rotate)%180==90,n=a?e.naturalHeight:e.naturalWidth,r=a?e.naturalWidth:e.naturalHeight,o=n/r,h=t.width,s=t.height;t.height*o>t.width?3===i?h=t.height*o:s=t.width/o:3===i?s=t.width/o:h=t.height*o;var c={aspectRatio:o,naturalWidth:n,naturalHeight:r,width:h,height:s};this.canvasData=c,this.limited=1===i||2===i,this.limitCanvas(!0,!0),c.width=Math.min(Math.max(c.width,c.minWidth),c.maxWidth),c.height=Math.min(Math.max(c.height,c.minHeight),c.maxHeight),c.left=(t.width-c.width)/2,c.top=(t.height-c.height)/2,c.oldLeft=c.left,c.oldTop=c.top,this.initialCanvasData=Ct({},c)},limitCanvas:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,r=this.cropBoxData,o=i.viewMode,h=n.aspectRatio,s=this.cropped&&r;if(t){var c=Number(i.minCanvasWidth)||0,l=Number(i.minCanvasHeight)||0;o>1?(c=Math.max(c,a.width),l=Math.max(l,a.height),3===o&&(l*h>c?c=l*h:l=c/h)):o>0&&(c?c=Math.max(c,s?r.width:0):l?l=Math.max(l,s?r.height:0):s&&(c=r.width,(l=r.height)*h>c?c=l*h:l=c/h));var p=Kt({aspectRatio:h,width:c,height:l});c=p.width,l=p.height,n.minWidth=c,n.minHeight=l,n.maxWidth=1/0,n.maxHeight=1/0}if(e)if(o>(s?0:1)){var d=a.width-n.width,u=a.height-n.height;n.minLeft=Math.min(0,d),n.minTop=Math.min(0,u),n.maxLeft=Math.max(0,d),n.maxTop=Math.max(0,u),s&&this.limited&&(n.minLeft=Math.min(r.left,r.left+(r.width-n.width)),n.minTop=Math.min(r.top,r.top+(r.height-n.height)),n.maxLeft=r.left,n.maxTop=r.top,2===o&&(n.width>=a.width&&(n.minLeft=Math.min(0,d),n.maxLeft=Math.max(0,d)),n.height>=a.height&&(n.minTop=Math.min(0,u),n.maxTop=Math.max(0,u))))}else n.minLeft=-n.width,n.minTop=-n.height,n.maxLeft=a.width,n.maxTop=a.height},renderCanvas:function(t,e){var i=this.canvasData,a=this.imageData;if(e){var n=Gt({width:a.naturalWidth*Math.abs(a.scaleX||1),height:a.naturalHeight*Math.abs(a.scaleY||1),degree:a.rotate||0}),r=n.width,o=n.height,h=i.width*(r/i.naturalWidth),s=i.height*(o/i.naturalHeight);i.left-=(h-i.width)/2,i.top-=(s-i.height)/2,i.width=h,i.height=s,i.aspectRatio=r/o,i.naturalWidth=r,i.naturalHeight=o,this.limitCanvas(!0,!1)}(i.width>i.maxWidth||i.widthi.maxHeight||i.heighte.width?n.height=n.width/i:n.width=n.height*i),this.cropBoxData=n,this.limitCropBox(!0,!0),n.width=Math.min(Math.max(n.width,n.minWidth),n.maxWidth),n.height=Math.min(Math.max(n.height,n.minHeight),n.maxHeight),n.width=Math.max(n.minWidth,n.width*a),n.height=Math.max(n.minHeight,n.height*a),n.left=e.left+(e.width-n.width)/2,n.top=e.top+(e.height-n.height)/2,n.oldLeft=n.left,n.oldTop=n.top,this.initialCropBoxData=Ct({},n)},limitCropBox:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,r=this.cropBoxData,o=this.limited,h=i.aspectRatio;if(t){var s=Number(i.minCropBoxWidth)||0,c=Number(i.minCropBoxHeight)||0,l=o?Math.min(a.width,n.width,n.width+n.left,a.width-n.left):a.width,p=o?Math.min(a.height,n.height,n.height+n.top,a.height-n.top):a.height;s=Math.min(s,a.width),c=Math.min(c,a.height),h&&(s&&c?c*h>s?c=s/h:s=c*h:s?c=s/h:c&&(s=c*h),p*h>l?p=l/h:l=p*h),r.minWidth=Math.min(s,l),r.minHeight=Math.min(c,p),r.maxWidth=l,r.maxHeight=p}e&&(o?(r.minLeft=Math.max(0,n.left),r.minTop=Math.max(0,n.top),r.maxLeft=Math.min(a.width,n.left+n.width)-r.width,r.maxTop=Math.min(a.height,n.top+n.height)-r.height):(r.minLeft=0,r.minTop=0,r.maxLeft=a.width-r.width,r.maxTop=a.height-r.height))},renderCropBox:function(){var t=this.options,e=this.containerData,i=this.cropBoxData;(i.width>i.maxWidth||i.widthi.maxHeight||i.height=e.width&&i.height>=e.height?y:w),Et(this.cropBox,Ct({width:i.width,height:i.height},Zt({translateX:i.left,translateY:i.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),Xt(this.element,Y,this.getData())}},se={initPreview:function(){var t=this.element,e=this.crossOrigin,i=this.options.preview,a=e?this.crossOriginUrl:this.url,n=t.alt||"The image to preview",r=document.createElement("img");if(e&&(r.crossOrigin=e),r.src=a,r.alt=n,this.viewBox.appendChild(r),this.viewBoxImage=r,i){var o=i;"string"==typeof i?o=t.ownerDocument.querySelectorAll(i):i.querySelector&&(o=[i]),this.previews=o,Mt(o,(function(t){var i=document.createElement("img");zt(t,R,{width:t.offsetWidth,height:t.offsetHeight,html:t.innerHTML}),e&&(i.crossOrigin=e),i.src=a,i.alt=n,i.style.cssText='display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"',t.innerHTML="",t.appendChild(i)}))}},resetPreview:function(){Mt(this.previews,(function(t){var e=It(t,R);Et(t,{width:e.width,height:e.height}),t.innerHTML=e.html,Wt(t,R)}))},preview:function(){var t=this.imageData,e=this.canvasData,i=this.cropBoxData,a=i.width,n=i.height,r=t.width,o=t.height,h=i.left-e.left-t.left,s=i.top-e.top-t.top;this.cropped&&!this.disabled&&(Et(this.viewBoxImage,Ct({width:r,height:o},Zt(Ct({translateX:-h,translateY:-s},t)))),Mt(this.previews,(function(e){var i=It(e,R),c=i.width,l=i.height,p=c,d=l,u=1;a&&(d=n*(u=c/a)),n&&d>l&&(p=a*(u=l/n),d=l),Et(e,{width:p,height:d}),Et(e.getElementsByTagName("img")[0],Ct({width:r*u,height:o*u},Zt(Ct({translateX:-h*u,translateY:-s*u},t))))})))}},ce={bind:function(){var t=this.element,e=this.options,i=this.cropper;bt(e.cropstart)&&_t(t,F,e.cropstart),bt(e.cropmove)&&_t(t,U,e.cropmove),bt(e.cropend)&&_t(t,P,e.cropend),bt(e.crop)&&_t(t,Y,e.crop),bt(e.zoom)&&_t(t,it,e.zoom),_t(i,$,this.onCropStart=this.cropStart.bind(this)),e.zoomable&&e.zoomOnWheel&&_t(i,et,this.onWheel=this.wheel.bind(this),{passive:!1,capture:!0}),e.toggleDragModeOnDblclick&&_t(i,q,this.onDblclick=this.dblclick.bind(this)),_t(t.ownerDocument,K,this.onCropMove=this.cropMove.bind(this)),_t(t.ownerDocument,G,this.onCropEnd=this.cropEnd.bind(this)),e.responsive&&_t(window,tt,this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,e=this.options,i=this.cropper;bt(e.cropstart)&&jt(t,F,e.cropstart),bt(e.cropmove)&&jt(t,U,e.cropmove),bt(e.cropend)&&jt(t,P,e.cropend),bt(e.crop)&&jt(t,Y,e.crop),bt(e.zoom)&&jt(t,it,e.zoom),jt(i,$,this.onCropStart),e.zoomable&&e.zoomOnWheel&&jt(i,et,this.onWheel,{passive:!1,capture:!0}),e.toggleDragModeOnDblclick&&jt(i,q,this.onDblclick),jt(t.ownerDocument,K,this.onCropMove),jt(t.ownerDocument,G,this.onCropEnd),e.responsive&&jt(window,tt,this.onResize)}},le={resize:function(){if(!this.disabled){var t,e,i=this.options,a=this.container,n=this.containerData,r=a.offsetWidth/n.width,o=a.offsetHeight/n.height,h=Math.abs(r-1)>Math.abs(o-1)?r:o;1!==h&&(i.restore&&(t=this.getCanvasData(),e=this.getCropBoxData()),this.render(),i.restore&&(this.setCanvasData(Mt(t,(function(e,i){t[i]=e*h}))),this.setCropBoxData(Mt(e,(function(t,i){e[i]=t*h})))))}},dblclick:function(){this.disabled||this.options.dragMode===X||this.setDragMode(At(this.dragBox,O)?_:j)},wheel:function(t){var e=this,i=Number(this.options.wheelZoomRatio)||.1,a=1;this.disabled||(t.preventDefault(),this.wheeling||(this.wheeling=!0,setTimeout((function(){e.wheeling=!1}),50),t.deltaY?a=t.deltaY>0?1:-1:t.wheelDelta?a=-t.wheelDelta/120:t.detail&&(a=t.detail>0?1:-1),this.zoom(-a*i,t)))},cropStart:function(t){var e=t.buttons,i=t.button;if(!(this.disabled||("mousedown"===t.type||"pointerdown"===t.type&&"mouse"===t.pointerType)&&(ut(e)&&1!==e||ut(i)&&0!==i||t.ctrlKey))){var a,n=this.options,r=this.pointers;t.changedTouches?Mt(t.changedTouches,(function(t){r[t.identifier]=Vt(t)})):r[t.pointerId||0]=Vt(t),a=Object.keys(r).length>1&&n.zoomable&&n.zoomOnTouch?x:It(t.target,L),nt.test(a)&&!1!==Xt(this.element,F,{originalEvent:t,action:a})&&(t.preventDefault(),this.action=a,this.cropping=!1,a===b&&(this.cropping=!0,Tt(this.dragBox,z)))}},cropMove:function(t){var e=this.action;if(!this.disabled&&e){var i=this.pointers;t.preventDefault(),!1!==Xt(this.element,U,{originalEvent:t,action:e})&&(t.changedTouches?Mt(t.changedTouches,(function(t){Ct(i[t.identifier]||{},Vt(t,!0))})):Ct(i[t.pointerId||0]||{},Vt(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var e=this.action,i=this.pointers;t.changedTouches?Mt(t.changedTouches,(function(t){delete i[t.identifier]})):delete i[t.pointerId||0],e&&(t.preventDefault(),Object.keys(i).length||(this.action=""),this.cropping&&(this.cropping=!1,Nt(this.dragBox,z,this.cropped&&this.options.modal)),Xt(this.element,P,{originalEvent:t,action:e}))}}},pe={change:function(t){var e,i=this.options,a=this.canvasData,n=this.containerData,r=this.cropBoxData,o=this.pointers,h=this.action,s=i.aspectRatio,c=r.left,l=r.top,p=r.width,d=r.height,u=c+p,g=l+d,m=0,f=0,v=n.width,O=n.height,N=!0;!s&&t.shiftKey&&(s=p&&d?p/d:1),this.limited&&(m=r.minLeft,f=r.minTop,v=m+Math.min(n.width,a.width,a.left+a.width),O=f+Math.min(n.height,a.height,a.top+a.height));var S=o[Object.keys(o)[0]],I={x:S.endX-S.startX,y:S.endY-S.startY},z=function(t){switch(t){case M:u+I.x>v&&(I.x=v-u);break;case C:c+I.xO&&(I.y=O-g)}};switch(h){case w:c+=I.x,l+=I.y;break;case M:if(I.x>=0&&(u>=v||s&&(l<=f||g>=O))){N=!1;break}z(M),(p+=I.x)<0&&(h=C,c-=p=-p),s&&(d=p/s,l+=(r.height-d)/2);break;case B:if(I.y<=0&&(l<=f||s&&(c<=m||u>=v))){N=!1;break}z(B),d-=I.y,l+=I.y,d<0&&(h=k,l-=d=-d),s&&(p=d*s,c+=(r.width-p)/2);break;case C:if(I.x<=0&&(c<=m||s&&(l<=f||g>=O))){N=!1;break}z(C),p-=I.x,c+=I.x,p<0&&(h=M,c-=p=-p),s&&(d=p/s,l+=(r.height-d)/2);break;case k:if(I.y>=0&&(g>=O||s&&(c<=m||u>=v))){N=!1;break}z(k),(d+=I.y)<0&&(h=B,l-=d=-d),s&&(p=d*s,c+=(r.width-p)/2);break;case D:if(s){if(I.y<=0&&(l<=f||u>=v)){N=!1;break}z(B),d-=I.y,l+=I.y,p=d*s}else z(B),z(M),I.x>=0?uf&&(d-=I.y,l+=I.y):(d-=I.y,l+=I.y);p<0&&d<0?(h=T,l-=d=-d,c-=p=-p):p<0?(h=E,c-=p=-p):d<0&&(h=A,l-=d=-d);break;case E:if(s){if(I.y<=0&&(l<=f||c<=m)){N=!1;break}z(B),d-=I.y,l+=I.y,p=d*s,c+=r.width-p}else z(B),z(C),I.x<=0?c>m?(p-=I.x,c+=I.x):I.y<=0&&l<=f&&(N=!1):(p-=I.x,c+=I.x),I.y<=0?l>f&&(d-=I.y,l+=I.y):(d-=I.y,l+=I.y);p<0&&d<0?(h=A,l-=d=-d,c-=p=-p):p<0?(h=D,c-=p=-p):d<0&&(h=T,l-=d=-d);break;case T:if(s){if(I.x<=0&&(c<=m||g>=O)){N=!1;break}z(C),p-=I.x,c+=I.x,d=p/s}else z(k),z(C),I.x<=0?c>m?(p-=I.x,c+=I.x):I.y>=0&&g>=O&&(N=!1):(p-=I.x,c+=I.x),I.y>=0?g=0&&(u>=v||g>=O)){N=!1;break}z(M),d=(p+=I.x)/s}else z(k),z(M),I.x>=0?u=0&&g>=O&&(N=!1):p+=I.x,I.y>=0?g0?h=I.y>0?A:D:I.x<0&&(c-=p,h=I.y>0?T:E),I.y<0&&(l-=d),this.cropped||(Ot(this.cropBox,H),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0))}N&&(r.width=p,r.height=d,r.left=c,r.top=l,this.action=h,this.renderCropBox()),Mt(o,(function(t){t.startX=t.endX,t.startY=t.endY}))}},de={crop:function(){return!this.ready||this.cropped||this.disabled||(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&Tt(this.dragBox,z),Ot(this.cropBox,H),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=Ct({},this.initialImageData),this.canvasData=Ct({},this.initialCanvasData),this.cropBoxData=Ct({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(Ct(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),Ot(this.dragBox,z),Tt(this.cropBox,H)),this},replace:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!this.disabled&&t&&(this.isImg&&(this.element.src=t),e?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,Mt(this.previews,(function(e){e.getElementsByTagName("img")[0].src=t})))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,Ot(this.cropper,N)),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,Tt(this.cropper,N)),this},destroy:function(){var t=this.element;return t[v]?(t[v]=void 0,this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),this):this},move:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=i.left,n=i.top;return this.moveTo(mt(t)?t:a+Number(t),mt(e)?e:n+Number(e))},moveTo:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.movable&&(ut(t)&&(i.left=t,a=!0),ut(e)&&(i.top=e,a=!0),a&&this.renderCanvas(!0)),this},zoom:function(t,e){var i=this.canvasData;return t=(t=Number(t))<0?1/(1-t):1+t,this.zoomTo(i.width*t/i.naturalWidth,null,e)},zoomTo:function(t,e,i){var a=this.options,n=this.canvasData,r=n.width,o=n.height,h=n.naturalWidth,s=n.naturalHeight;if((t=Number(t))>=0&&this.ready&&!this.disabled&&a.zoomable){var c=h*t,l=s*t;if(!1===Xt(this.element,it,{ratio:t,oldRatio:r/h,originalEvent:i}))return this;if(i){var p=this.pointers,d=Yt(this.cropper),u=p&&Object.keys(p).length?$t(p):{pageX:i.pageX,pageY:i.pageY};n.left-=(c-r)*((u.pageX-d.left-n.left)/r),n.top-=(l-o)*((u.pageY-d.top-n.top)/o)}else wt(e)&&ut(e.x)&&ut(e.y)?(n.left-=(c-r)*((e.x-n.left)/r),n.top-=(l-o)*((e.y-n.top)/o)):(n.left-=(c-r)/2,n.top-=(l-o)/2);n.width=c,n.height=l,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return ut(t=Number(t))&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var e=this.imageData.scaleY;return this.scale(t,ut(e)?e:1)},scaleY:function(t){var e=this.imageData.scaleX;return this.scale(ut(e)?e:1,t)},scale:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.imageData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.scalable&&(ut(t)&&(i.scaleX=t,a=!0),ut(e)&&(i.scaleY=e,a=!0),a&&this.renderCanvas(!0,!0)),this},getData:function(){var t,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=this.options,a=this.imageData,n=this.canvasData,r=this.cropBoxData;if(this.ready&&this.cropped){t={x:r.left-n.left,y:r.top-n.top,width:r.width,height:r.height};var o=a.width/a.naturalWidth;if(Mt(t,(function(e,i){t[i]=e/o})),e){var h=Math.round(t.y+t.height),s=Math.round(t.x+t.width);t.x=Math.round(t.x),t.y=Math.round(t.y),t.width=s-t.x,t.height=h-t.y}}else t={x:0,y:0,width:0,height:0};return i.rotatable&&(t.rotate=a.rotate||0),i.scalable&&(t.scaleX=a.scaleX||1,t.scaleY=a.scaleY||1),t},setData:function(t){var e=this.options,i=this.imageData,a=this.canvasData,n={};if(this.ready&&!this.disabled&&wt(t)){var r=!1;e.rotatable&&ut(t.rotate)&&t.rotate!==i.rotate&&(i.rotate=t.rotate,r=!0),e.scalable&&(ut(t.scaleX)&&t.scaleX!==i.scaleX&&(i.scaleX=t.scaleX,r=!0),ut(t.scaleY)&&t.scaleY!==i.scaleY&&(i.scaleY=t.scaleY,r=!0)),r&&this.renderCanvas(!0,!0);var o=i.width/i.naturalWidth;ut(t.x)&&(n.left=t.x*o+a.left),ut(t.y)&&(n.top=t.y*o+a.top),ut(t.width)&&(n.width=t.width*o),ut(t.height)&&(n.height=t.height*o),this.setCropBoxData(n)}return this},getContainerData:function(){return this.ready?Ct({},this.containerData):{}},getImageData:function(){return this.sized?Ct({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,e={};return this.ready&&Mt(["left","top","width","height","naturalWidth","naturalHeight"],(function(i){e[i]=t[i]})),e},setCanvasData:function(t){var e=this.canvasData,i=e.aspectRatio;return this.ready&&!this.disabled&&wt(t)&&(ut(t.left)&&(e.left=t.left),ut(t.top)&&(e.top=t.top),ut(t.width)?(e.width=t.width,e.height=t.width/i):ut(t.height)&&(e.height=t.height,e.width=t.height*i),this.renderCanvas(!0)),this},getCropBoxData:function(){var t,e=this.cropBoxData;return this.ready&&this.cropped&&(t={left:e.left,top:e.top,width:e.width,height:e.height}),t||{}},setCropBoxData:function(t){var e,i,a=this.cropBoxData,n=this.options.aspectRatio;return this.ready&&this.cropped&&!this.disabled&&wt(t)&&(ut(t.left)&&(a.left=t.left),ut(t.top)&&(a.top=t.top),ut(t.width)&&t.width!==a.width&&(e=!0,a.width=t.width),ut(t.height)&&t.height!==a.height&&(i=!0,a.height=t.height),n&&(e?a.height=a.width/n:i&&(a.width=a.height*n)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var e=this.canvasData,i=Jt(this.image,this.imageData,e,t);if(!this.cropped)return i;var a=this.getData(),n=a.x,r=a.y,o=a.width,s=a.height,c=i.width/Math.floor(e.naturalWidth);1!==c&&(n*=c,r*=c,o*=c,s*=c);var l=o/s,p=Kt({aspectRatio:l,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),d=Kt({aspectRatio:l,width:t.minWidth||0,height:t.minHeight||0},"cover"),u=Kt({aspectRatio:l,width:t.width||(1!==c?i.width:o),height:t.height||(1!==c?i.height:s)}),g=u.width,m=u.height;g=Math.min(p.width,Math.max(d.width,g)),m=Math.min(p.height,Math.max(d.height,m));var f=document.createElement("canvas"),v=f.getContext("2d");f.width=Bt(g),f.height=Bt(m),v.fillStyle=t.fillColor||"transparent",v.fillRect(0,0,g,m);var w=t.imageSmoothingEnabled,b=void 0===w||w,y=t.imageSmoothingQuality;v.imageSmoothingEnabled=b,y&&(v.imageSmoothingQuality=y);var x,M,C,k,B,D,E=i.width,A=i.height,T=n,O=r;T<=-o||T>E?(T=0,x=0,C=0,B=0):T<=0?(C=-T,T=0,B=x=Math.min(E,o+T)):T<=E&&(C=0,B=x=Math.min(o,E-T)),x<=0||O<=-s||O>A?(O=0,M=0,k=0,D=0):O<=0?(k=-O,O=0,D=M=Math.min(A,s+O)):O<=A&&(k=0,D=M=Math.min(s,A-O));var N=[T,O,x,M];if(B>0&&D>0){var H=g/o;N.push(C*H,k*H,B*H,D*H)}return v.drawImage.apply(v,[i].concat(h(N.map((function(t){return Math.floor(Bt(t))}))))),f},setAspectRatio:function(t){var e=this.options;return this.disabled||mt(t)||(e.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var e=this.options,i=this.dragBox,a=this.face;if(this.ready&&!this.disabled){var n=t===j,r=e.movable&&t===_;t=n||r?t:X,e.dragMode=t,zt(i,L,t),Nt(i,O,n),Nt(i,W,r),e.cropBoxMovable||(zt(a,L,t),Nt(a,O,n),Nt(a,W,r))}return this}},ue=g.Cropper,ge=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(a(this,t),!e||!ht.test(e.tagName))throw new Error("The first argument is required and must be an or element.");this.element=e,this.options=Ct({},lt,wt(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return r(t,[{key:"init",value:function(){var t,e=this.element,i=e.tagName.toLowerCase();if(!e[v]){if(e[v]=this,"img"===i){if(this.isImg=!0,t=e.getAttribute("src")||"",this.originalUrl=t,!t)return;t=e.src}else"canvas"===i&&window.HTMLCanvasElement&&(t=e.toDataURL());this.load(t)}}},{key:"load",value:function(t){var e=this;if(t){this.url=t,this.imageData={};var i=this.element,a=this.options;if(a.rotatable||a.scalable||(a.checkOrientation=!1),a.checkOrientation&&window.ArrayBuffer)if(rt.test(t))ot.test(t)?this.read(ae(t)):this.clone();else{var n=new XMLHttpRequest,r=this.clone.bind(this);this.reloading=!0,this.xhr=n,n.onabort=r,n.onerror=r,n.ontimeout=r,n.onprogress=function(){n.getResponseHeader("content-type")!==at&&n.abort()},n.onload=function(){e.read(n.response)},n.onloadend=function(){e.reloading=!1,e.xhr=null},a.checkCrossOrigin&&Ft(t)&&i.crossOrigin&&(t=qt(t)),n.open("GET",t,!0),n.responseType="arraybuffer",n.withCredentials="use-credentials"===i.crossOrigin,n.send()}else this.clone()}}},{key:"read",value:function(t){var e=this.options,i=this.imageData,a=re(t),n=0,r=1,o=1;if(a>1){this.url=ne(t,at);var h=oe(a);n=h.rotate,r=h.scaleX,o=h.scaleY}e.rotatable&&(i.rotate=n),e.scalable&&(i.scaleX=r,i.scaleY=o),this.clone()}},{key:"clone",value:function(){var t=this.element,e=this.url,i=t.crossOrigin,a=e;this.options.checkCrossOrigin&&Ft(e)&&(i||(i="anonymous"),a=qt(e)),this.crossOrigin=i,this.crossOriginUrl=a;var n=document.createElement("img");i&&(n.crossOrigin=i),n.src=a||e,n.alt=t.alt||"The image to crop",this.image=n,n.onload=this.start.bind(this),n.onerror=this.stop.bind(this),Tt(n,S),t.parentNode.insertBefore(n,t.nextSibling)}},{key:"start",value:function(){var t=this,e=this.image;e.onload=null,e.onerror=null,this.sizing=!0;var i=g.navigator&&/(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(g.navigator.userAgent),a=function(e,i){Ct(t.imageData,{naturalWidth:e,naturalHeight:i,aspectRatio:e/i}),t.initialImageData=Ct({},t.imageData),t.sizing=!1,t.sized=!0,t.build()};if(!e.naturalWidth||i){var n=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=n,n.onload=function(){a(n.width,n.height),i||r.removeChild(n)},n.src=e.src,i||(n.style.cssText="left:0;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;opacity:0;position:absolute;top:0;z-index:-1;",r.appendChild(n))}else a(e.naturalWidth,e.naturalHeight)}},{key:"stop",value:function(){var t=this.image;t.onload=null,t.onerror=null,t.parentNode.removeChild(t),this.image=null}},{key:"build",value:function(){if(this.sized&&!this.ready){var t=this.element,e=this.options,i=this.image,a=t.parentNode,n=document.createElement("div");n.innerHTML=pt;var r=n.querySelector(".".concat(v,"-container")),o=r.querySelector(".".concat(v,"-canvas")),h=r.querySelector(".".concat(v,"-drag-box")),s=r.querySelector(".".concat(v,"-crop-box")),c=s.querySelector(".".concat(v,"-face"));this.container=a,this.cropper=r,this.canvas=o,this.dragBox=h,this.cropBox=s,this.viewBox=r.querySelector(".".concat(v,"-view-box")),this.face=c,o.appendChild(i),Tt(t,H),a.insertBefore(r,t.nextSibling),Ot(i,S),this.initPreview(),this.bind(),e.initialAspectRatio=Math.max(0,e.initialAspectRatio)||NaN,e.aspectRatio=Math.max(0,e.aspectRatio)||NaN,e.viewMode=Math.max(0,Math.min(3,Math.round(e.viewMode)))||0,Tt(s,H),e.guides||Tt(s.getElementsByClassName("".concat(v,"-dashed")),H),e.center||Tt(s.getElementsByClassName("".concat(v,"-center")),H),e.background&&Tt(r,"".concat(v,"-bg")),e.highlight||Tt(c,I),e.cropBoxMovable&&(Tt(c,W),zt(c,L,w)),e.cropBoxResizable||(Tt(s.getElementsByClassName("".concat(v,"-line")),H),Tt(s.getElementsByClassName("".concat(v,"-point")),H)),this.render(),this.ready=!0,this.setDragMode(e.dragMode),e.autoCrop&&this.crop(),this.setData(e.data),bt(e.ready)&&_t(t,J,e.ready,{once:!0}),Xt(t,J)}}},{key:"unbuild",value:function(){if(this.ready){this.ready=!1,this.unbind(),this.resetPreview();var t=this.cropper.parentNode;t&&t.removeChild(this.cropper),Ot(this.element,H)}}},{key:"uncreate",value:function(){this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?(this.xhr.onabort=null,this.xhr.abort()):this.image&&this.stop()}}],[{key:"noConflict",value:function(){return window.Cropper=ue,t}},{key:"setDefaults",value:function(t){Ct(lt,wt(t)&&t)}}]),t}();return Ct(ge.prototype,he,se,ce,le,pe,de),ge}()},722:(t,e,i)=>{"use strict";i.d(e,{Z:()=>r});var a=i(645),n=i.n(a)()((function(t){return t[1]}));n.push([t.id,'/*!\n * Cropper.js v1.5.13\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2022-11-20T05:30:43.444Z\n */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{image-orientation:0deg;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;height:100%;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}',""]);const r=n},645:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i=t(e);return e[2]?"@media ".concat(e[2]," {").concat(i,"}"):i})).join("")},e.i=function(t,i,a){"string"==typeof t&&(t=[[null,t,""]]);var n={};if(a)for(var r=0;r{"use strict";var a,n=function(){return void 0===a&&(a=Boolean(window&&document&&document.all&&!window.atob)),a},r=function(){var t={};return function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}t[e]=i}return t[e]}}(),o=[];function h(t){for(var e=-1,i=0;i{var e;e=961,t(t.s=e)}]); \ No newline at end of file diff --git a/public/js/crop-image.js.LICENSE.txt b/public/js/crop-image.js.LICENSE.txt new file mode 100644 index 0000000..337201f --- /dev/null +++ b/public/js/crop-image.js.LICENSE.txt @@ -0,0 +1,9 @@ +/*! + * Cropper.js v1.5.13 + * https://fengyuanchen.github.io/cropperjs + * + * Copyright 2015-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2022-11-20T05:30:46.114Z + */ diff --git a/public/js/file-download.js b/public/js/file-download.js new file mode 100644 index 0000000..abe63e3 --- /dev/null +++ b/public/js/file-download.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[268],{149:()=>{window.fileDownload=function(){return{save:function(e,n,o,c){var d=new Blob([n],{type:o}),a=window.document.createElement("a");a.href=window.URL.createObjectURL(d),a.download="".concat(e,".").concat(c),document.body.appendChild(a),a.click(),document.body.removeChild(a)}}}}},e=>{var n;n=149,e(e.s=n)}]); \ No newline at end of file diff --git a/public/js/file-upload.js b/public/js/file-upload.js new file mode 100644 index 0000000..545d344 --- /dev/null +++ b/public/js/file-upload.js @@ -0,0 +1,49 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/file-upload"],{ + +/***/ "./resources/js/file-upload.js": +/*!*************************************!*\ + !*** ./resources/js/file-upload.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +window.uploadPhoto = function (_ref) { + var url = _ref.url, + onUpload = _ref.onUpload; + return { + url: url, + onUpload: onUpload, + upload: function upload(e) { + var _this = this; + + if (!e.target.files.length) return; + var data = new FormData(); + data.append('logo', e.target.files[0]); + fetch(this.url, { + method: 'POST', + body: data + }).then(function () { + return _this.onUpload(); + }); + }, + select: function select() { + document.getElementById('photo').click(); + } + }; +}; + +/***/ }), + +/***/ 1: +/*!*******************************************!*\ + !*** multi ./resources/js/file-upload.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! /Users/josip/Work/deployer/resources/js/file-upload.js */"./resources/js/file-upload.js"); + + +/***/ }) + +},[[1,"/js/manifest"]]]); \ No newline at end of file diff --git a/public/js/manifest.js b/public/js/manifest.js new file mode 100644 index 0000000..274efe4 --- /dev/null +++ b/public/js/manifest.js @@ -0,0 +1 @@ +(()=>{"use strict";var r,e={},o={};function t(r){var n=o[r];if(void 0!==n)return n.exports;var a=o[r]={id:r,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.exports}t.m=e,r=[],t.O=(e,o,n,a)=>{if(!o){var l=1/0;for(u=0;u=a)&&Object.keys(t.O).every((r=>t.O[r](o[f])))?o.splice(f--,1):(i=!1,a0&&r[u-1][2]>a;u--)r[u]=r[u-1];r[u]=[o,n,a]},t.n=r=>{var e=r&&r.__esModule?()=>r.default:()=>r;return t.d(e,{a:e}),e},t.d=(r,e)=>{for(var o in e)t.o(e,o)&&!t.o(r,o)&&Object.defineProperty(r,o,{enumerable:!0,get:e[o]})},t.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r={929:0,170:0};t.O.j=e=>0===r[e];var e=(e,o)=>{var n,a,[l,i,f]=o,s=0;if(l.some((e=>0!==r[e]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(f)var u=f(t)}for(e&&e(o);s{void 0===s[i]?s[i]=a[i]:e(a[i])&&e(s[i])&&Object.keys(a[i]).length>0&&t(s[i],a[i])}))}const s={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function a(){const e="undefined"!=typeof document?document:{};return t(e,s),e}const i={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function r(){const e="undefined"!=typeof window?window:{};return t(e,i),e}class n extends Array{constructor(e){"number"==typeof e?super(e):(super(...e||[]),function(e){const t=e.__proto__;Object.defineProperty(e,"__proto__",{get:()=>t,set(e){t.__proto__=e}})}(this))}}function l(e){void 0===e&&(e=[]);const t=[];return e.forEach((e=>{Array.isArray(e)?t.push(...l(e)):t.push(e)})),t}function o(e,t){return Array.prototype.filter.call(e,t)}function d(e,t){const s=r(),i=a();let l=[];if(!t&&e instanceof n)return e;if(!e)return new n(l);if("string"==typeof e){const s=e.trim();if(s.indexOf("<")>=0&&s.indexOf(">")>=0){let e="div";0===s.indexOf("e.split(" "))));return this.forEach((e=>{e.classList.add(...a)})),this},removeClass:function(){for(var e=arguments.length,t=new Array(e),s=0;se.split(" "))));return this.forEach((e=>{e.classList.remove(...a)})),this},hasClass:function(){for(var e=arguments.length,t=new Array(e),s=0;se.split(" "))));return o(this,(e=>a.filter((t=>e.classList.contains(t))).length>0)).length>0},toggleClass:function(){for(var e=arguments.length,t=new Array(e),s=0;se.split(" "))));this.forEach((e=>{a.forEach((t=>{e.classList.toggle(t)}))}))},attr:function(e,t){if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(let s=0;s=0;e-=1){const i=a[e];r&&i.listener===r||r&&i.listener&&i.listener.dom7proxy&&i.listener.dom7proxy===r?(s.removeEventListener(t,i.proxyListener,n),a.splice(e,1)):r||(s.removeEventListener(t,i.proxyListener,n),a.splice(e,1))}}}return this},trigger:function(){const e=r();for(var t=arguments.length,s=new Array(t),a=0;at>0)),i.dispatchEvent(t),i.dom7EventData=[],delete i.dom7EventData}}}return this},transitionEnd:function(e){const t=this;return e&&t.on("transitionend",(function s(a){a.target===this&&(e.call(this,a),t.off("transitionend",s))})),this},outerWidth:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetWidth+parseFloat(e.getPropertyValue("margin-right"))+parseFloat(e.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){const e=this.styles();return this[0].offsetHeight+parseFloat(e.getPropertyValue("margin-top"))+parseFloat(e.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},styles:function(){const e=r();return this[0]?e.getComputedStyle(this[0],null):{}},offset:function(){if(this.length>0){const e=r(),t=a(),s=this[0],i=s.getBoundingClientRect(),n=t.body,l=s.clientTop||n.clientTop||0,o=s.clientLeft||n.clientLeft||0,d=s===e?e.scrollY:s.scrollTop,c=s===e?e.scrollX:s.scrollLeft;return{top:i.top+d-l,left:i.left+c-o}}return null},css:function(e,t){const s=r();let a;if(1===arguments.length){if("string"!=typeof e){for(a=0;a{e.apply(t,[t,s])})),this):this},html:function(e){if(void 0===e)return this[0]?this[0].innerHTML:null;for(let t=0;tt-1)return d([]);if(e<0){const s=t+e;return d(s<0?[]:[this[s]])}return d([this[e]])},append:function(){let e;const t=a();for(let s=0;s=0;i-=1)this[s].insertBefore(a.childNodes[i],this[s].childNodes[0])}else if(e instanceof n)for(i=0;i0?e?this[0].nextElementSibling&&d(this[0].nextElementSibling).is(e)?d([this[0].nextElementSibling]):d([]):this[0].nextElementSibling?d([this[0].nextElementSibling]):d([]):d([])},nextAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.nextElementSibling;){const a=s.nextElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},prev:function(e){if(this.length>0){const t=this[0];return e?t.previousElementSibling&&d(t.previousElementSibling).is(e)?d([t.previousElementSibling]):d([]):t.previousElementSibling?d([t.previousElementSibling]):d([])}return d([])},prevAll:function(e){const t=[];let s=this[0];if(!s)return d([]);for(;s.previousElementSibling;){const a=s.previousElementSibling;e?d(a).is(e)&&t.push(a):t.push(a),s=a}return d(t)},parent:function(e){const t=[];for(let s=0;s6&&(i=i.split(", ").map((e=>e.replace(",","."))).join(", ")),n=new s.WebKitCSSMatrix("none"===i?"":i)):(n=l.MozTransform||l.OTransform||l.MsTransform||l.msTransform||l.transform||l.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),a=n.toString().split(",")),"x"===t&&(i=s.WebKitCSSMatrix?n.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=s.WebKitCSSMatrix?n.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function m(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function f(e){return"undefined"!=typeof window&&void 0!==window.HTMLElement?e instanceof HTMLElement:e&&(1===e.nodeType||11===e.nodeType)}function g(){const e=Object(arguments.length<=0?void 0:arguments[0]),t=["__proto__","constructor","prototype"];for(let s=1;st.indexOf(e)<0));for(let t=0,i=s.length;tn?"next":"prev",p=(e,t)=>"next"===c&&e>=t||"prev"===c&&e<=t,u=()=>{l=(new Date).getTime(),null===o&&(o=l);const e=Math.max(Math.min((l-o)/d,1),0),r=.5-Math.cos(e*Math.PI)/2;let c=n+r*(s-n);if(p(c,s)&&(c=s),t.wrapperEl.scrollTo({[a]:c}),p(c,s))return t.wrapperEl.style.overflow="hidden",t.wrapperEl.style.scrollSnapType="",setTimeout((()=>{t.wrapperEl.style.overflow="",t.wrapperEl.scrollTo({[a]:c})})),void i.cancelAnimationFrame(t.cssModeFrameID);t.cssModeFrameID=i.requestAnimationFrame(u)};u()}let b,x,y;function E(){return b||(b=function(){const e=r(),t=a();return{smoothScroll:t.documentElement&&"scrollBehavior"in t.documentElement.style,touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch),passiveListener:function(){let t=!1;try{const s=Object.defineProperty({},"passive",{get(){t=!0}});e.addEventListener("testPassiveListener",null,s)}catch(e){}return t}(),gestures:"ongesturestart"in e}}()),b}function C(e){return void 0===e&&(e={}),x||(x=function(e){let{userAgent:t}=void 0===e?{}:e;const s=E(),a=r(),i=a.navigator.platform,n=t||a.navigator.userAgent,l={ios:!1,android:!1},o=a.screen.width,d=a.screen.height,c=n.match(/(Android);?[\s\/]+([\d.]+)?/);let p=n.match(/(iPad).*OS\s([\d_]+)/);const u=n.match(/(iPod)(.*OS\s([\d_]+))?/),h=!p&&n.match(/(iPhone\sOS|iOS)\s([\d_]+)/),m="Win32"===i;let f="MacIntel"===i;return!p&&f&&s.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(`${o}x${d}`)>=0&&(p=n.match(/(Version)\/([\d.]+)/),p||(p=[0,1,"13_0_0"]),f=!1),c&&!m&&(l.os="android",l.android=!0),(p||h||u)&&(l.os="ios",l.ios=!0),l}(e)),x}function T(){return y||(y=function(){const e=r();return{isSafari:function(){const t=e.navigator.userAgent.toLowerCase();return t.indexOf("safari")>=0&&t.indexOf("chrome")<0&&t.indexOf("android")<0}(),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent)}}()),y}Object.keys(c).forEach((e=>{Object.defineProperty(d.fn,e,{value:c[e],writable:!0})}));var $={on(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;const i=s?"unshift":"push";return e.split(" ").forEach((e=>{a.eventsListeners[e]||(a.eventsListeners[e]=[]),a.eventsListeners[e][i](t)})),a},once(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;function i(){a.off(e,i),i.__emitterProxy&&delete i.__emitterProxy;for(var s=arguments.length,r=new Array(s),n=0;n=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return!s.eventsListeners||s.destroyed?s:s.eventsListeners?(e.split(" ").forEach((e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach(((a,i)=>{(a===t||a.__emitterProxy&&a.__emitterProxy===t)&&s.eventsListeners[e].splice(i,1)}))})),s):s},emit(){const e=this;if(!e.eventsListeners||e.destroyed)return e;if(!e.eventsListeners)return e;let t,s,a;for(var i=arguments.length,r=new Array(i),n=0;n{e.eventsAnyListeners&&e.eventsAnyListeners.length&&e.eventsAnyListeners.forEach((e=>{e.apply(a,[t,...s])})),e.eventsListeners&&e.eventsListeners[t]&&e.eventsListeners[t].forEach((e=>{e.apply(a,s)}))})),e}};var S={updateSize:function(){const e=this;let t,s;const a=e.$el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:a[0].clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:a[0].clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(a.css("padding-left")||0,10)-parseInt(a.css("padding-right")||0,10),s=s-parseInt(a.css("padding-top")||0,10)-parseInt(a.css("padding-bottom")||0,10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))},updateSlides:function(){const e=this;function t(t){return e.isHorizontal()?t:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[t]}function s(e,s){return parseFloat(e.getPropertyValue(t(s))||0)}const a=e.params,{$wrapperEl:i,size:r,rtlTranslate:n,wrongRTL:l}=e,o=e.virtual&&a.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,c=i.children(`.${e.params.slideClass}`),p=o?e.virtual.slides.length:c.length;let u=[];const h=[],m=[];let f=a.slidesOffsetBefore;"function"==typeof f&&(f=a.slidesOffsetBefore.call(e));let g=a.slidesOffsetAfter;"function"==typeof g&&(g=a.slidesOffsetAfter.call(e));const w=e.snapGrid.length,b=e.slidesGrid.length;let x=a.spaceBetween,y=-f,E=0,C=0;if(void 0===r)return;"string"==typeof x&&x.indexOf("%")>=0&&(x=parseFloat(x.replace("%",""))/100*r),e.virtualSize=-x,n?c.css({marginLeft:"",marginBottom:"",marginTop:""}):c.css({marginRight:"",marginBottom:"",marginTop:""}),a.centeredSlides&&a.cssMode&&(v(e.wrapperEl,"--swiper-centered-offset-before",""),v(e.wrapperEl,"--swiper-centered-offset-after",""));const T=a.grid&&a.grid.rows>1&&e.grid;let $;T&&e.grid.initSlides(p);const S="auto"===a.slidesPerView&&a.breakpoints&&Object.keys(a.breakpoints).filter((e=>void 0!==a.breakpoints[e].slidesPerView)).length>0;for(let i=0;i1&&u.push(e.virtualSize-r)}if(0===u.length&&(u=[0]),0!==a.spaceBetween){const s=e.isHorizontal()&&n?"marginLeft":t("marginRight");c.filter(((e,t)=>!a.cssMode||t!==c.length-1)).css({[s]:`${x}px`})}if(a.centeredSlides&&a.centeredSlidesBounds){let e=0;m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween;const t=e-r;u=u.map((e=>e<0?-f:e>t?t+g:e))}if(a.centerInsufficientSlides){let e=0;if(m.forEach((t=>{e+=t+(a.spaceBetween?a.spaceBetween:0)})),e-=a.spaceBetween,e{u[s]=e-t})),h.forEach(((e,s)=>{h[s]=e+t}))}}if(Object.assign(e,{slides:c,snapGrid:u,slidesGrid:h,slidesSizesGrid:m}),a.centeredSlides&&a.cssMode&&!a.centeredSlidesBounds){v(e.wrapperEl,"--swiper-centered-offset-before",-u[0]+"px"),v(e.wrapperEl,"--swiper-centered-offset-after",e.size/2-m[m.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map((e=>e+t)),e.slidesGrid=e.slidesGrid.map((e=>e+s))}if(p!==d&&e.emit("slidesLengthChange"),u.length!==w&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==b&&e.emit("slidesGridLengthChange"),a.watchSlidesProgress&&e.updateSlidesOffset(),!(o||a.cssMode||"slide"!==a.effect&&"fade"!==a.effect)){const t=`${a.containerModifierClass}backface-hidden`,s=e.$el.hasClass(t);p<=a.maxBackfaceHiddenSlides?s||e.$el.addClass(t):s&&e.$el.removeClass(t)}},updateAutoHeight:function(e){const t=this,s=[],a=t.virtual&&t.params.virtual.enabled;let i,r=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>a?t.slides.filter((t=>parseInt(t.getAttribute("data-swiper-slide-index"),10)===e))[0]:t.slides.eq(e)[0];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)(t.visibleSlides||d([])).each((e=>{s.push(e)}));else for(i=0;it.slides.length&&!a)break;s.push(n(e))}else s.push(n(t.activeIndex));for(i=0;ir?e:r}(r||0===r)&&t.$wrapperEl.css("height",`${r}px`)},updateSlidesOffset:function(){const e=this,t=e.slides;for(let s=0;s=0&&p1&&u<=t.size||p<=0&&u>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(e),a.eq(e).addClass(s.slideVisibleClass)),l.progress=i?-d:d,l.originalProgress=i?-c:c}t.visibleSlides=d(t.visibleSlides)},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,a=t.maxTranslate()-t.minTranslate();let{progress:i,isBeginning:r,isEnd:n}=t;const l=r,o=n;0===a?(i=0,r=!0,n=!0):(i=(e-t.minTranslate())/a,r=i<=0,n=i>=1),Object.assign(t,{progress:i,isBeginning:r,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),r&&!l&&t.emit("reachBeginning toEdge"),n&&!o&&t.emit("reachEnd toEdge"),(l&&!r||o&&!n)&&t.emit("fromEdge"),t.emit("progress",i)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,$wrapperEl:a,activeIndex:i,realIndex:r}=e,n=e.virtual&&s.virtual.enabled;let l;t.removeClass(`${s.slideActiveClass} ${s.slideNextClass} ${s.slidePrevClass} ${s.slideDuplicateActiveClass} ${s.slideDuplicateNextClass} ${s.slideDuplicatePrevClass}`),l=n?e.$wrapperEl.find(`.${s.slideClass}[data-swiper-slide-index="${i}"]`):t.eq(i),l.addClass(s.slideActiveClass),s.loop&&(l.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass));let o=l.nextAll(`.${s.slideClass}`).eq(0).addClass(s.slideNextClass);s.loop&&0===o.length&&(o=t.eq(0),o.addClass(s.slideNextClass));let d=l.prevAll(`.${s.slideClass}`).eq(0).addClass(s.slidePrevClass);s.loop&&0===d.length&&(d=t.eq(-1),d.addClass(s.slidePrevClass)),s.loop&&(o.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass),d.hasClass(s.slideDuplicateClass)?a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass):a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass)),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{slidesGrid:a,snapGrid:i,params:r,activeIndex:n,realIndex:l,snapIndex:o}=t;let d,c=e;if(void 0===c){for(let e=0;e=a[e]&&s=a[e]&&s=a[e]&&(c=e);r.normalizeSlideIndex&&(c<0||void 0===c)&&(c=0)}if(i.indexOf(s)>=0)d=i.indexOf(s);else{const e=Math.min(r.slidesPerGroupSkip,c);d=e+Math.floor((c-e)/r.slidesPerGroup)}if(d>=i.length&&(d=i.length-1),c===n)return void(d!==o&&(t.snapIndex=d,t.emit("snapIndexChange")));const p=parseInt(t.slides.eq(c).attr("data-swiper-slide-index")||c,10);Object.assign(t,{snapIndex:d,realIndex:p,previousIndex:n,activeIndex:c}),t.emit("activeIndexChange"),t.emit("snapIndexChange"),l!==p&&t.emit("realIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&t.emit("slideChange")},updateClickedSlide:function(e){const t=this,s=t.params,a=d(e).closest(`.${s.slideClass}`)[0];let i,r=!1;if(a)for(let e=0;eo?o:a&&en?"next":r=o.length&&(g=o.length-1);const v=-o[g];if(l.normalizeSlideIndex)for(let e=0;e=s&&t=s&&t=s&&(n=e)}if(r.initialized&&n!==p){if(!r.allowSlideNext&&vr.translate&&v>r.maxTranslate()&&(p||0)!==n)return!1}let b;if(n!==(c||0)&&s&&r.emit("beforeSlideChangeStart"),r.updateProgress(v),b=n>p?"next":n{r.wrapperEl.style.scrollSnapType="",r._swiperImmediateVirtual=!1}))}else{if(!r.support.smoothScroll)return w({swiper:r,targetPosition:s,side:e?"left":"top"}),!0;h.scrollTo({[e?"left":"top"]:s,behavior:"smooth"})}return!0}return r.setTransition(t),r.setTranslate(v),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),0===t?r.transitionEnd(s,b):r.animating||(r.animating=!0,r.onSlideToWrapperTransitionEnd||(r.onSlideToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.$wrapperEl[0].removeEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].removeEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd),r.onSlideToWrapperTransitionEnd=null,delete r.onSlideToWrapperTransitionEnd,r.transitionEnd(s,b))}),r.$wrapperEl[0].addEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.$wrapperEl[0].addEventListener("webkitTransitionEnd",r.onSlideToWrapperTransitionEnd)),!0},slideToLoop:function(e,t,s,a){if(void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===s&&(s=!0),"string"==typeof e){const t=parseInt(e,10);if(!isFinite(t))throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${e}] given.`);e=t}const i=this;let r=e;return i.params.loop&&(r+=i.loopedSlides),i.slideTo(r,t,s,a)},slideNext:function(e,t,s){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);const a=this,{animating:i,enabled:r,params:n}=a;if(!r)return a;let l=n.slidesPerGroup;"auto"===n.slidesPerView&&1===n.slidesPerGroup&&n.slidesPerGroupAuto&&(l=Math.max(a.slidesPerViewDynamic("current",!0),1));const o=a.activeIndexc(e)));let h=n[u.indexOf(p)-1];if(void 0===h&&i.cssMode){let e;n.forEach(((t,s)=>{p>=t&&(e=s)})),void 0!==e&&(h=n[e>0?e-1:e])}let m=0;if(void 0!==h&&(m=l.indexOf(h),m<0&&(m=a.activeIndex-1),"auto"===i.slidesPerView&&1===i.slidesPerGroup&&i.slidesPerGroupAuto&&(m=m-a.slidesPerViewDynamic("previous",!0)+1,m=Math.max(m,0))),i.rewind&&a.isBeginning){const i=a.params.virtual&&a.params.virtual.enabled&&a.virtual?a.virtual.slides.length-1:a.slides.length-1;return a.slideTo(i,e,t,s)}return a.slideTo(m,e,t,s)},slideReset:function(e,t,s){return void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),this.slideTo(this.activeIndex,e,t,s)},slideToClosest:function(e,t,s,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),void 0===a&&(a=.5);const i=this;let r=i.activeIndex;const n=Math.min(i.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/i.params.slidesPerGroup),o=i.rtlTranslate?i.translate:-i.translate;if(o>=i.snapGrid[l]){const e=i.snapGrid[l];o-e>(i.snapGrid[l+1]-e)*a&&(r+=i.params.slidesPerGroup)}else{const e=i.snapGrid[l-1];o-e<=(i.snapGrid[l]-e)*a&&(r-=i.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,i.slidesGrid.length-1),i.slideTo(r,e,t,s)},slideToClickedSlide:function(){const e=this,{params:t,$wrapperEl:s}=e,a="auto"===t.slidesPerView?e.slidesPerViewDynamic():t.slidesPerView;let i,r=e.clickedIndex;if(t.loop){if(e.animating)return;i=parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"),10),t.centeredSlides?re.slides.length-e.loopedSlides+a/2?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r):r>e.slides.length-a?(e.loopFix(),r=s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(),p((()=>{e.slideTo(r)}))):e.slideTo(r)}else e.slideTo(r)}};var z={loopCreate:function(){const e=this,t=a(),{params:s,$wrapperEl:i}=e,r=i.children().length>0?d(i.children()[0].parentNode):i;r.children(`.${s.slideClass}.${s.slideDuplicateClass}`).remove();let n=r.children(`.${s.slideClass}`);if(s.loopFillGroupWithBlank){const e=s.slidesPerGroup-n.length%s.slidesPerGroup;if(e!==s.slidesPerGroup){for(let a=0;an.length&&e.params.loopedSlidesLimit&&(e.loopedSlides=n.length);const l=[],o=[];n.each(((e,t)=>{d(e).attr("data-swiper-slide-index",t)}));for(let t=0;t=0;e-=1)r.prepend(d(l[e].cloneNode(!0)).addClass(s.slideDuplicateClass))},loopFix:function(){const e=this;e.emit("beforeLoopFix");const{activeIndex:t,slides:s,loopedSlides:a,allowSlidePrev:i,allowSlideNext:r,snapGrid:n,rtlTranslate:l}=e;let o;e.allowSlidePrev=!0,e.allowSlideNext=!0;const d=-n[t]-e.getTranslate();if(t=s.length-a){o=-s.length+t+a,o+=a;e.slideTo(o,0,!1,!0)&&0!==d&&e.setTranslate((l?-e.translate:e.translate)-d)}e.allowSlidePrev=i,e.allowSlideNext=r,e.emit("loopFix")},loopDestroy:function(){const{$wrapperEl:e,params:t,slides:s}=this;e.children(`.${t.slideClass}.${t.slideDuplicateClass},.${t.slideClass}.${t.slideBlankClass}`).remove(),s.removeAttr("data-swiper-slide-index")}};function L(e){const t=this,s=a(),i=r(),n=t.touchEventsData,{params:l,touches:o,enabled:c}=t;if(!c)return;if(t.animating&&l.preventInteractionOnTransition)return;!t.animating&&l.cssMode&&l.loop&&t.loopFix();let p=e;p.originalEvent&&(p=p.originalEvent);let h=d(p.target);if("wrapper"===l.touchEventsTarget&&!h.closest(t.wrapperEl).length)return;if(n.isTouchEvent="touchstart"===p.type,!n.isTouchEvent&&"which"in p&&3===p.which)return;if(!n.isTouchEvent&&"button"in p&&p.button>0)return;if(n.isTouched&&n.isMoved)return;const m=!!l.noSwipingClass&&""!==l.noSwipingClass,f=e.composedPath?e.composedPath():e.path;m&&p.target&&p.target.shadowRoot&&f&&(h=d(f[0]));const g=l.noSwipingSelector?l.noSwipingSelector:`.${l.noSwipingClass}`,v=!(!p.target||!p.target.shadowRoot);if(l.noSwiping&&(v?function(e,t){return void 0===t&&(t=this),function t(s){if(!s||s===a()||s===r())return null;s.assignedSlot&&(s=s.assignedSlot);const i=s.closest(e);return i||s.getRootNode?i||t(s.getRootNode().host):null}(t)}(g,h[0]):h.closest(g)[0]))return void(t.allowClick=!0);if(l.swipeHandler&&!h.closest(l.swipeHandler)[0])return;o.currentX="touchstart"===p.type?p.targetTouches[0].pageX:p.pageX,o.currentY="touchstart"===p.type?p.targetTouches[0].pageY:p.pageY;const w=o.currentX,b=o.currentY,x=l.edgeSwipeDetection||l.iOSEdgeSwipeDetection,y=l.edgeSwipeThreshold||l.iOSEdgeSwipeThreshold;if(x&&(w<=y||w>=i.innerWidth-y)){if("prevent"!==x)return;e.preventDefault()}if(Object.assign(n,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=w,o.startY=b,n.touchStartTime=u(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,l.threshold>0&&(n.allowThresholdMove=!1),"touchstart"!==p.type){let e=!0;h.is(n.focusableElements)&&(e=!1,"SELECT"===h[0].nodeName&&(n.isTouched=!1)),s.activeElement&&d(s.activeElement).is(n.focusableElements)&&s.activeElement!==h[0]&&s.activeElement.blur();const a=e&&t.allowTouchMove&&l.touchStartPreventDefault;!l.touchStartForcePreventDefault&&!a||h[0].isContentEditable||p.preventDefault()}t.params.freeMode&&t.params.freeMode.enabled&&t.freeMode&&t.animating&&!l.cssMode&&t.freeMode.onTouchStart(),t.emit("touchStart",p)}function O(e){const t=a(),s=this,i=s.touchEventsData,{params:r,touches:n,rtlTranslate:l,enabled:o}=s;if(!o)return;let c=e;if(c.originalEvent&&(c=c.originalEvent),!i.isTouched)return void(i.startMoving&&i.isScrolling&&s.emit("touchMoveOpposite",c));if(i.isTouchEvent&&"touchmove"!==c.type)return;const p="touchmove"===c.type&&c.targetTouches&&(c.targetTouches[0]||c.changedTouches[0]),h="touchmove"===c.type?p.pageX:c.pageX,m="touchmove"===c.type?p.pageY:c.pageY;if(c.preventedByNestedSwiper)return n.startX=h,void(n.startY=m);if(!s.allowTouchMove)return d(c.target).is(i.focusableElements)||(s.allowClick=!1),void(i.isTouched&&(Object.assign(n,{startX:h,startY:m,currentX:h,currentY:m}),i.touchStartTime=u()));if(i.isTouchEvent&&r.touchReleaseOnEdges&&!r.loop)if(s.isVertical()){if(mn.startY&&s.translate>=s.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(hn.startX&&s.translate>=s.minTranslate())return;if(i.isTouchEvent&&t.activeElement&&c.target===t.activeElement&&d(c.target).is(i.focusableElements))return i.isMoved=!0,void(s.allowClick=!1);if(i.allowTouchCallbacks&&s.emit("touchMove",c),c.targetTouches&&c.targetTouches.length>1)return;n.currentX=h,n.currentY=m;const f=n.currentX-n.startX,g=n.currentY-n.startY;if(s.params.threshold&&Math.sqrt(f**2+g**2)=25&&(e=180*Math.atan2(Math.abs(g),Math.abs(f))/Math.PI,i.isScrolling=s.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&s.emit("touchMoveOpposite",c),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling)return void(i.isTouched=!1);if(!i.startMoving)return;s.allowClick=!1,!r.cssMode&&c.cancelable&&c.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&c.stopPropagation(),i.isMoved||(r.loop&&!r.cssMode&&s.loopFix(),i.startTranslate=s.getTranslate(),s.setTransition(0),s.animating&&s.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!r.grabCursor||!0!==s.allowSlideNext&&!0!==s.allowSlidePrev||s.setGrabCursor(!0),s.emit("sliderFirstMove",c)),s.emit("sliderMove",c),i.isMoved=!0;let v=s.isHorizontal()?f:g;n.diff=v,v*=r.touchRatio,l&&(v=-v),s.swipeDirection=v>0?"prev":"next",i.currentTranslate=v+i.startTranslate;let w=!0,b=r.resistanceRatio;if(r.touchReleaseOnEdges&&(b=0),v>0&&i.currentTranslate>s.minTranslate()?(w=!1,r.resistance&&(i.currentTranslate=s.minTranslate()-1+(-s.minTranslate()+i.startTranslate+v)**b)):v<0&&i.currentTranslatei.startTranslate&&(i.currentTranslate=i.startTranslate),s.allowSlidePrev||s.allowSlideNext||(i.currentTranslate=i.startTranslate),r.threshold>0){if(!(Math.abs(v)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=s.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&s.freeMode||r.watchSlidesProgress)&&(s.updateActiveIndex(),s.updateSlidesClasses()),s.params.freeMode&&r.freeMode.enabled&&s.freeMode&&s.freeMode.onTouchMove(),s.updateProgress(i.currentTranslate),s.setTranslate(i.currentTranslate))}function I(e){const t=this,s=t.touchEventsData,{params:a,touches:i,rtlTranslate:r,slidesGrid:n,enabled:l}=t;if(!l)return;let o=e;if(o.originalEvent&&(o=o.originalEvent),s.allowTouchCallbacks&&t.emit("touchEnd",o),s.allowTouchCallbacks=!1,!s.isTouched)return s.isMoved&&a.grabCursor&&t.setGrabCursor(!1),s.isMoved=!1,void(s.startMoving=!1);a.grabCursor&&s.isMoved&&s.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);const d=u(),c=d-s.touchStartTime;if(t.allowClick){const e=o.path||o.composedPath&&o.composedPath();t.updateClickedSlide(e&&e[0]||o.target),t.emit("tap click",o),c<300&&d-s.lastClickTime<300&&t.emit("doubleTap doubleClick",o)}if(s.lastClickTime=u(),p((()=>{t.destroyed||(t.allowClick=!0)})),!s.isTouched||!s.isMoved||!t.swipeDirection||0===i.diff||s.currentTranslate===s.startTranslate)return s.isTouched=!1,s.isMoved=!1,void(s.startMoving=!1);let h;if(s.isTouched=!1,s.isMoved=!1,s.startMoving=!1,h=a.followFinger?r?t.translate:-t.translate:-s.currentTranslate,a.cssMode)return;if(t.params.freeMode&&a.freeMode.enabled)return void t.freeMode.onTouchEnd({currentPos:h});let m=0,f=t.slidesSizesGrid[0];for(let e=0;e=n[e]&&h=n[e]&&(m=e,f=n[n.length-1]-n[n.length-2])}let g=null,v=null;a.rewind&&(t.isBeginning?v=t.params.virtual&&t.params.virtual.enabled&&t.virtual?t.virtual.slides.length-1:t.slides.length-1:t.isEnd&&(g=0));const w=(h-n[m])/f,b=ma.longSwipesMs){if(!a.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(w>=a.longSwipesRatio?t.slideTo(a.rewind&&t.isEnd?g:m+b):t.slideTo(m)),"prev"===t.swipeDirection&&(w>1-a.longSwipesRatio?t.slideTo(m+b):null!==v&&w<0&&Math.abs(w)>a.longSwipesRatio?t.slideTo(v):t.slideTo(m))}else{if(!a.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(o.target===t.navigation.nextEl||o.target===t.navigation.prevEl)?o.target===t.navigation.nextEl?t.slideTo(m+b):t.slideTo(m):("next"===t.swipeDirection&&t.slideTo(null!==g?g:m+b),"prev"===t.swipeDirection&&t.slideTo(null!==v?v:m))}}function A(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:a,allowSlidePrev:i,snapGrid:r}=e;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses(),("auto"===t.slidesPerView||t.slidesPerView>1)&&e.isEnd&&!e.isBeginning&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.run(),e.allowSlidePrev=i,e.allowSlideNext=a,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}function D(e){const t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function G(){const e=this,{wrapperEl:t,rtlTranslate:s,enabled:a}=e;if(!a)return;let i;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const r=e.maxTranslate()-e.minTranslate();i=0===r?0:(e.translate-e.minTranslate())/r,i!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}let N=!1;function B(){}const H=(e,t)=>{const s=a(),{params:i,touchEvents:r,el:n,wrapperEl:l,device:o,support:d}=e,c=!!i.nested,p="on"===t?"addEventListener":"removeEventListener",u=t;if(d.touch){const t=!("touchstart"!==r.start||!d.passiveListener||!i.passiveListeners)&&{passive:!0,capture:!1};n[p](r.start,e.onTouchStart,t),n[p](r.move,e.onTouchMove,d.passiveListener?{passive:!1,capture:c}:c),n[p](r.end,e.onTouchEnd,t),r.cancel&&n[p](r.cancel,e.onTouchEnd,t)}else n[p](r.start,e.onTouchStart,!1),s[p](r.move,e.onTouchMove,c),s[p](r.end,e.onTouchEnd,!1);(i.preventClicks||i.preventClicksPropagation)&&n[p]("click",e.onClick,!0),i.cssMode&&l[p]("scroll",e.onScroll),i.updateOnWindowResize?e[u](o.ios||o.android?"resize orientationchange observerUpdate":"resize observerUpdate",A,!0):e[u]("observerUpdate",A,!0)};var X={attachEvents:function(){const e=this,t=a(),{params:s,support:i}=e;e.onTouchStart=L.bind(e),e.onTouchMove=O.bind(e),e.onTouchEnd=I.bind(e),s.cssMode&&(e.onScroll=G.bind(e)),e.onClick=D.bind(e),i.touch&&!N&&(t.addEventListener("touchstart",B),N=!0),H(e,"on")},detachEvents:function(){H(this,"off")}};const Y=(e,t)=>e.grid&&t.grid&&t.grid.rows>1;var R={addClasses:function(){const e=this,{classNames:t,params:s,rtl:a,$el:i,device:r,support:n}=e,l=function(e,t){const s=[];return e.forEach((e=>{"object"==typeof e?Object.keys(e).forEach((a=>{e[a]&&s.push(t+a)})):"string"==typeof e&&s.push(t+e)})),s}(["initialized",s.direction,{"pointer-events":!n.touch},{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:a},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:r.android},{ios:r.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides},{"watch-progress":s.watchSlidesProgress}],s.containerModifierClass);t.push(...l),i.addClass([...t].join(" ")),e.emitContainerClasses()},removeClasses:function(){const{$el:e,classNames:t}=this;e.removeClass(t.join(" ")),this.emitContainerClasses()}};var W={init:!0,direction:"horizontal",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopedSlidesLimit:!0,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,rewind:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,maxBackfaceHiddenSlides:10,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0,_emitClasses:!1};function q(e,t){return function(s){void 0===s&&(s={});const a=Object.keys(s)[0],i=s[a];"object"==typeof i&&null!==i?(["navigation","pagination","scrollbar"].indexOf(a)>=0&&!0===e[a]&&(e[a]={auto:!0}),a in e&&"enabled"in i?(!0===e[a]&&(e[a]={enabled:!0}),"object"!=typeof e[a]||"enabled"in e[a]||(e[a].enabled=!0),e[a]||(e[a]={enabled:!1}),g(t,s)):g(t,s)):g(t,s)}}const j={eventsEmitter:$,update:S,translate:M,transition:{setTransition:function(e,t){const s=this;s.params.cssMode||s.$wrapperEl.transition(e),s.emit("setTransition",e,t)},transitionStart:function(e,t){void 0===e&&(e=!0);const s=this,{params:a}=s;a.cssMode||(a.autoHeight&&s.updateAutoHeight(),P({swiper:s,runCallbacks:e,direction:t,step:"Start"}))},transitionEnd:function(e,t){void 0===e&&(e=!0);const s=this,{params:a}=s;s.animating=!1,a.cssMode||(s.setTransition(0),P({swiper:s,runCallbacks:e,direction:t,step:"End"}))}},slide:k,loop:z,grabCursor:{setGrabCursor:function(e){const t=this;if(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;s.style.cursor="move",s.style.cursor=e?"grabbing":"grab"},unsetGrabCursor:function(){const e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="")}},events:X,breakpoints:{setBreakpoint:function(){const e=this,{activeIndex:t,initialized:s,loopedSlides:a=0,params:i,$el:r}=e,n=i.breakpoints;if(!n||n&&0===Object.keys(n).length)return;const l=e.getBreakpoint(n,e.params.breakpointsBase,e.el);if(!l||e.currentBreakpoint===l)return;const o=(l in n?n[l]:void 0)||e.originalParams,d=Y(e,i),c=Y(e,o),p=i.enabled;d&&!c?(r.removeClass(`${i.containerModifierClass}grid ${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!d&&c&&(r.addClass(`${i.containerModifierClass}grid`),(o.grid.fill&&"column"===o.grid.fill||!o.grid.fill&&"column"===i.grid.fill)&&r.addClass(`${i.containerModifierClass}grid-column`),e.emitContainerClasses()),["navigation","pagination","scrollbar"].forEach((t=>{const s=i[t]&&i[t].enabled,a=o[t]&&o[t].enabled;s&&!a&&e[t].disable(),!s&&a&&e[t].enable()}));const u=o.direction&&o.direction!==i.direction,h=i.loop&&(o.slidesPerView!==i.slidesPerView||u);u&&s&&e.changeDirection(),g(e.params,o);const m=e.params.enabled;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),p&&!m?e.disable():!p&&m&&e.enable(),e.currentBreakpoint=l,e.emit("_beforeBreakpoint",o),h&&s&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-a+e.loopedSlides,0,!1)),e.emit("breakpoint",o)},getBreakpoint:function(e,t,s){if(void 0===t&&(t="window"),!e||"container"===t&&!s)return;let a=!1;const i=r(),n="window"===t?i.innerHeight:s.clientHeight,l=Object.keys(e).map((e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:n*t,point:e}}return{value:e,point:e}}));l.sort(((e,t)=>parseInt(e.value,10)-parseInt(t.value,10)));for(let e=0;es}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}},classes:R,images:{loadImage:function(e,t,s,a,i,n){const l=r();let o;function c(){n&&n()}d(e).parent("picture")[0]||e.complete&&i?c():t?(o=new l.Image,o.onload=c,o.onerror=c,a&&(o.sizes=a),s&&(o.srcset=s),t&&(o.src=t)):c()},preloadImages:function(){const e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(let s=0;s1){const e=[];return d(t.el).each((s=>{const a=g({},t,{el:s});e.push(new V(a))})),e}const r=this;r.__swiper__=!0,r.support=E(),r.device=C({userAgent:t.userAgent}),r.browser=T(),r.eventsListeners={},r.eventsAnyListeners=[],r.modules=[...r.__modules__],t.modules&&Array.isArray(t.modules)&&r.modules.push(...t.modules);const n={};r.modules.forEach((e=>{e({swiper:r,extendParams:q(t,n),on:r.on.bind(r),once:r.once.bind(r),off:r.off.bind(r),emit:r.emit.bind(r)})}));const l=g({},W,n);return r.params=g({},l,_,t),r.originalParams=g({},r.params),r.passedParams=g({},t),r.params&&r.params.on&&Object.keys(r.params.on).forEach((e=>{r.on(e,r.params.on[e])})),r.params&&r.params.onAny&&r.onAny(r.params.onAny),r.$=d,Object.assign(r,{enabled:r.params.enabled,el:e,classNames:[],slides:d(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===r.params.direction,isVertical:()=>"vertical"===r.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:r.params.allowSlideNext,allowSlidePrev:r.params.allowSlidePrev,touchEvents:function(){const e=["touchstart","touchmove","touchend","touchcancel"],t=["pointerdown","pointermove","pointerup"];return r.touchEventsTouch={start:e[0],move:e[1],end:e[2],cancel:e[3]},r.touchEventsDesktop={start:t[0],move:t[1],end:t[2]},r.support.touch||!r.params.simulateTouch?r.touchEventsTouch:r.touchEventsDesktop}(),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:r.params.focusableElements,lastClickTime:u(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:r.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),r.emit("_swiper"),r.params.init&&r.init(),r}enable(){const e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))}disable(){const e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))}setProgress(e,t){const s=this;e=Math.min(Math.max(e,0),1);const a=s.minTranslate(),i=(s.maxTranslate()-a)*e+a;s.translateTo(i,void 0===t?0:t),s.updateActiveIndex(),s.updateSlidesClasses()}emitContainerClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=e.el.className.split(" ").filter((t=>0===t.indexOf("swiper")||0===t.indexOf(e.params.containerModifierClass)));e.emit("_containerClasses",t.join(" "))}getSlideClasses(e){const t=this;return t.destroyed?"":e.className.split(" ").filter((e=>0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass))).join(" ")}emitSlidesClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=[];e.slides.each((s=>{const a=e.getSlideClasses(s);t.push({slideEl:s,classNames:a}),e.emit("_slideClass",s,a)})),e.emit("_slideClasses",t)}slidesPerViewDynamic(e,t){void 0===e&&(e="current"),void 0===t&&(t=!1);const{params:s,slides:a,slidesGrid:i,slidesSizesGrid:r,size:n,activeIndex:l}=this;let o=1;if(s.centeredSlides){let e,t=a[l].swiperSlideSize;for(let s=l+1;sn&&(e=!0));for(let s=l-1;s>=0;s-=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0))}else if("current"===e)for(let e=l+1;e=0;e-=1){i[l]-i[e]1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),i||a()),s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t){void 0===t&&(t=!0);const s=this,a=s.params.direction;return e||(e="horizontal"===a?"vertical":"horizontal"),e===a||"horizontal"!==e&&"vertical"!==e||(s.$el.removeClass(`${s.params.containerModifierClass}${a}`).addClass(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.slides.each((t=>{"vertical"===e?t.style.width="":t.style.height=""})),s.emit("changeDirection"),t&&s.update()),s}changeLanguageDirection(e){const t=this;t.rtl&&"rtl"===e||!t.rtl&&"ltr"===e||(t.rtl="rtl"===e,t.rtlTranslate="horizontal"===t.params.direction&&t.rtl,t.rtl?(t.$el.addClass(`${t.params.containerModifierClass}rtl`),t.el.dir="rtl"):(t.$el.removeClass(`${t.params.containerModifierClass}rtl`),t.el.dir="ltr"),t.update())}mount(e){const t=this;if(t.mounted)return!0;const s=d(e||t.params.el);if(!(e=s[0]))return!1;e.swiper=t;const i=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let r=(()=>{if(e&&e.shadowRoot&&e.shadowRoot.querySelector){const t=d(e.shadowRoot.querySelector(i()));return t.children=e=>s.children(e),t}return s.children?s.children(i()):d(s).children(i())})();if(0===r.length&&t.params.createElements){const e=a().createElement("div");r=d(e),e.className=t.params.wrapperClass,s.append(e),s.children(`.${t.params.slideClass}`).each((e=>{r.append(e)}))}return Object.assign(t,{$el:s,el:e,$wrapperEl:r,wrapperEl:r[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===s.css("direction")),wrongRTL:"-webkit-box"===r.css("display")}),!0}init(e){const t=this;if(t.initialized)return t;return!1===t.mount(e)||(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.params.loop&&t.loopCreate(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.preloadImages&&t.preloadImages(),t.params.loop?t.slideTo(t.params.initialSlide+t.loopedSlides,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.attachEvents(),t.initialized=!0,t.emit("init"),t.emit("afterInit")),t}destroy(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);const s=this,{params:a,$el:i,$wrapperEl:r,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),a.loop&&s.loopDestroy(),t&&(s.removeClasses(),i.removeAttr("style"),r.removeAttr("style"),n&&n.length&&n.removeClass([a.slideVisibleClass,a.slideActiveClass,a.slideNextClass,a.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),s.emit("destroy"),Object.keys(s.eventsListeners).forEach((e=>{s.off(e)})),!1!==e&&(s.$el[0].swiper=null,function(e){const t=e;Object.keys(t).forEach((e=>{try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}}))}(s)),s.destroyed=!0),null}static extendDefaults(e){g(_,e)}static get extendedDefaults(){return _}static get defaults(){return W}static installModule(e){V.prototype.__modules__||(V.prototype.__modules__=[]);const t=V.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach((e=>V.installModule(e))),V):(V.installModule(e),V)}}function F(e,t,s,i){const r=a();return e.params.createElements&&Object.keys(i).forEach((a=>{if(!s[a]&&!0===s.auto){let n=e.$el.children(`.${i[a]}`)[0];n||(n=r.createElement("div"),n.className=i[a],e.$el.append(n)),s[a]=n,t[a]=n}})),s}function U(e){return void 0===e&&(e=""),`.${e.trim().replace(/([\.:!\/])/g,"\\$1").replace(/ /g,".")}`}function K(e){const t=this,{$wrapperEl:s,params:a}=t;if(a.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(let t=0;t=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides.eq(t);e.remove(),d.unshift(e)}if("object"==typeof t&&"length"in t){for(let e=0;ee?n+t.length:n}else a.append(t);for(let e=0;e{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)})),a("setTranslate",(()=>{s.params.effect===t&&i()})),a("setTransition",((e,a)=>{s.params.effect===t&&r(a)})),a("transitionEnd",(()=>{if(s.params.effect===t&&o){if(!d||!d().slideShadows)return;s.slides.each((e=>{s.$(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").remove()})),o()}})),a("virtualUpdate",(()=>{s.params.effect===t&&(s.slides.length||(c=!0),requestAnimationFrame((()=>{c&&s.slides&&s.slides.length&&(i(),c=!1)})))}))}function se(e,t){return e.transformEl?t.find(e.transformEl).css({"backface-visibility":"hidden","-webkit-backface-visibility":"hidden"}):t}function ae(e){let{swiper:t,duration:s,transformEl:a,allSlides:i}=e;const{slides:r,activeIndex:n,$wrapperEl:l}=t;if(t.params.virtualTranslate&&0!==s){let e,s=!1;e=i?a?r.find(a):r:a?r.eq(n).find(a):r.eq(n),e.transitionEnd((()=>{if(s)return;if(!t||t.destroyed)return;s=!0,t.animating=!1;const e=["webkitTransitionEnd","transitionend"];for(let t=0;t`),i.append(r)),r}Object.keys(j).forEach((e=>{Object.keys(j[e]).forEach((t=>{V.prototype[t]=j[e][t]}))})),V.use([function(e){let{swiper:t,on:s,emit:a}=e;const i=r();let n=null,l=null;const o=()=>{t&&!t.destroyed&&t.initialized&&(a("beforeResize"),a("resize"))},d=()=>{t&&!t.destroyed&&t.initialized&&a("orientationchange")};s("init",(()=>{t.params.resizeObserver&&void 0!==i.ResizeObserver?t&&!t.destroyed&&t.initialized&&(n=new ResizeObserver((e=>{l=i.requestAnimationFrame((()=>{const{width:s,height:a}=t;let i=s,r=a;e.forEach((e=>{let{contentBoxSize:s,contentRect:a,target:n}=e;n&&n!==t.el||(i=a?a.width:(s[0]||s).inlineSize,r=a?a.height:(s[0]||s).blockSize)})),i===s&&r===a||o()}))})),n.observe(t.el)):(i.addEventListener("resize",o),i.addEventListener("orientationchange",d))})),s("destroy",(()=>{l&&i.cancelAnimationFrame(l),n&&n.unobserve&&t.el&&(n.unobserve(t.el),n=null),i.removeEventListener("resize",o),i.removeEventListener("orientationchange",d)}))},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=[],l=r(),o=function(e,t){void 0===t&&(t={});const s=new(l.MutationObserver||l.WebkitMutationObserver)((e=>{if(1===e.length)return void i("observerUpdate",e[0]);const t=function(){i("observerUpdate",e[0])};l.requestAnimationFrame?l.requestAnimationFrame(t):l.setTimeout(t,0)}));s.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),n.push(s)};s({observer:!1,observeParents:!1,observeSlideChildren:!1}),a("init",(()=>{if(t.params.observer){if(t.params.observeParents){const e=t.$el.parents();for(let t=0;t{n.forEach((e=>{e.disconnect()})),n.splice(0,n.length)}))}]);const re=[function(e){let t,{swiper:s,extendParams:a,on:i,emit:r}=e;function n(e,t){const a=s.params.virtual;if(a.cache&&s.virtual.cache[t])return s.virtual.cache[t];const i=a.renderSlide?d(a.renderSlide.call(s,e,t)):d(`
${e}
`);return i.attr("data-swiper-slide-index")||i.attr("data-swiper-slide-index",t),a.cache&&(s.virtual.cache[t]=i),i}function l(e){const{slidesPerView:t,slidesPerGroup:a,centeredSlides:i}=s.params,{addSlidesBefore:l,addSlidesAfter:o}=s.params.virtual,{from:d,to:c,slides:p,slidesGrid:u,offset:h}=s.virtual;s.params.cssMode||s.updateActiveIndex();const m=s.activeIndex||0;let f,g,v;f=s.rtlTranslate?"right":s.isHorizontal()?"left":"top",i?(g=Math.floor(t/2)+a+o,v=Math.floor(t/2)+a+l):(g=t+(a-1)+o,v=a+l);const w=Math.max((m||0)-v,0),b=Math.min((m||0)+g,p.length-1),x=(s.slidesGrid[w]||0)-(s.slidesGrid[0]||0);function y(){s.updateSlides(),s.updateProgress(),s.updateSlidesClasses(),s.lazy&&s.params.lazy.enabled&&s.lazy.load(),r("virtualUpdate")}if(Object.assign(s.virtual,{from:w,to:b,offset:x,slidesGrid:s.slidesGrid}),d===w&&c===b&&!e)return s.slidesGrid!==u&&x!==h&&s.slides.css(f,`${x}px`),s.updateProgress(),void r("virtualUpdate");if(s.params.virtual.renderExternal)return s.params.virtual.renderExternal.call(s,{offset:x,from:w,to:b,slides:function(){const e=[];for(let t=w;t<=b;t+=1)e.push(p[t]);return e}()}),void(s.params.virtual.renderExternalUpdate?y():r("virtualUpdate"));const E=[],C=[];if(e)s.$wrapperEl.find(`.${s.params.slideClass}`).remove();else for(let e=d;e<=c;e+=1)(eb)&&s.$wrapperEl.find(`.${s.params.slideClass}[data-swiper-slide-index="${e}"]`).remove();for(let t=0;t=w&&t<=b&&(void 0===c||e?C.push(t):(t>c&&C.push(t),t{s.$wrapperEl.append(n(p[e],e))})),E.sort(((e,t)=>t-e)).forEach((e=>{s.$wrapperEl.prepend(n(p[e],e))})),s.$wrapperEl.children(".swiper-slide").css(f,`${x}px`),y()}a({virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}}),s.virtual={cache:{},from:void 0,to:void 0,slides:[],offset:0,slidesGrid:[]},i("beforeInit",(()=>{s.params.virtual.enabled&&(s.virtual.slides=s.params.virtual.slides,s.classNames.push(`${s.params.containerModifierClass}virtual`),s.params.watchSlidesProgress=!0,s.originalParams.watchSlidesProgress=!0,s.params.initialSlide||l())})),i("setTranslate",(()=>{s.params.virtual.enabled&&(s.params.cssMode&&!s._immediateVirtual?(clearTimeout(t),t=setTimeout((()=>{l()}),100)):l())})),i("init update resize",(()=>{s.params.virtual.enabled&&s.params.cssMode&&v(s.wrapperEl,"--swiper-virtual-size",`${s.virtualSize}px`)})),Object.assign(s.virtual,{appendSlide:function(e){if("object"==typeof e&&"length"in e)for(let t=0;t{const a=e[s],r=a.attr("data-swiper-slide-index");r&&a.attr("data-swiper-slide-index",parseInt(r,10)+i),t[parseInt(s,10)+i]=a})),s.virtual.cache=t}l(!0),s.slideTo(a,0)},removeSlide:function(e){if(null==e)return;let t=s.activeIndex;if(Array.isArray(e))for(let a=e.length-1;a>=0;a-=1)s.virtual.slides.splice(e[a],1),s.params.virtual.cache&&delete s.virtual.cache[e[a]],e[a]0&&0===t.$el.parents(`.${t.params.slideActiveClass}`).length)return;const a=t.$el,i=a[0].clientWidth,r=a[0].clientHeight,n=o.innerWidth,l=o.innerHeight,d=t.$el.offset();s&&(d.left-=t.$el[0].scrollLeft);const c=[[d.left,d.top],[d.left+i,d.top],[d.left,d.top+r],[d.left+i,d.top+r]];for(let t=0;t=0&&s[0]<=n&&s[1]>=0&&s[1]<=l){if(0===s[0]&&0===s[1])continue;e=!0}}if(!e)return}t.isHorizontal()?((d||c||p||u)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),((c||u)&&!s||(d||p)&&s)&&t.slideNext(),((d||p)&&!s||(c||u)&&s)&&t.slidePrev()):((d||c||h||m)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),(c||m)&&t.slideNext(),(d||h)&&t.slidePrev()),n("keyPress",i)}}function p(){t.keyboard.enabled||(d(l).on("keydown",c),t.keyboard.enabled=!0)}function u(){t.keyboard.enabled&&(d(l).off("keydown",c),t.keyboard.enabled=!1)}t.keyboard={enabled:!1},s({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}}),i("init",(()=>{t.params.keyboard.enabled&&p()})),i("destroy",(()=>{t.keyboard.enabled&&u()})),Object.assign(t.keyboard,{enable:p,disable:u})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=r();let l;s({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null}}),t.mousewheel={enabled:!1};let o,c=u();const h=[];function m(){t.enabled&&(t.mouseEntered=!0)}function f(){t.enabled&&(t.mouseEntered=!1)}function g(e){return!(t.params.mousewheel.thresholdDelta&&e.delta=6&&u()-c<60||(e.direction<0?t.isEnd&&!t.params.loop||t.animating||(t.slideNext(),i("scroll",e.raw)):t.isBeginning&&!t.params.loop||t.animating||(t.slidePrev(),i("scroll",e.raw)),c=(new n.Date).getTime(),!1)))}function v(e){let s=e,a=!0;if(!t.enabled)return;const r=t.params.mousewheel;t.params.cssMode&&s.preventDefault();let n=t.$el;if("container"!==t.params.mousewheel.eventsTarget&&(n=d(t.params.mousewheel.eventsTarget)),!t.mouseEntered&&!n[0].contains(s.target)&&!r.releaseOnEdges)return!0;s.originalEvent&&(s=s.originalEvent);let c=0;const m=t.rtlTranslate?-1:1,f=function(e){let t=0,s=0,a=0,i=0;return"detail"in e&&(s=e.detail),"wheelDelta"in e&&(s=-e.wheelDelta/120),"wheelDeltaY"in e&&(s=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=s,s=0),a=10*t,i=10*s,"deltaY"in e&&(i=e.deltaY),"deltaX"in e&&(a=e.deltaX),e.shiftKey&&!a&&(a=i,i=0),(a||i)&&e.deltaMode&&(1===e.deltaMode?(a*=40,i*=40):(a*=800,i*=800)),a&&!t&&(t=a<1?-1:1),i&&!s&&(s=i<1?-1:1),{spinX:t,spinY:s,pixelX:a,pixelY:i}}(s);if(r.forceToAxis)if(t.isHorizontal()){if(!(Math.abs(f.pixelX)>Math.abs(f.pixelY)))return!0;c=-f.pixelX*m}else{if(!(Math.abs(f.pixelY)>Math.abs(f.pixelX)))return!0;c=-f.pixelY}else c=Math.abs(f.pixelX)>Math.abs(f.pixelY)?-f.pixelX*m:-f.pixelY;if(0===c)return!0;r.invert&&(c=-c);let v=t.getTranslate()+c*r.sensitivity;if(v>=t.minTranslate()&&(v=t.minTranslate()),v<=t.maxTranslate()&&(v=t.maxTranslate()),a=!!t.params.loop||!(v===t.minTranslate()||v===t.maxTranslate()),a&&t.params.nested&&s.stopPropagation(),t.params.freeMode&&t.params.freeMode.enabled){const e={time:u(),delta:Math.abs(c),direction:Math.sign(c)},a=o&&e.time=t.minTranslate()&&(n=t.minTranslate()),n<=t.maxTranslate()&&(n=t.maxTranslate()),t.setTransition(0),t.setTranslate(n),t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses(),(!d&&t.isBeginning||!u&&t.isEnd)&&t.updateSlidesClasses(),t.params.freeMode.sticky){clearTimeout(l),l=void 0,h.length>=15&&h.shift();const s=h.length?h[h.length-1]:void 0,a=h[0];if(h.push(e),s&&(e.delta>s.delta||e.direction!==s.direction))h.splice(0);else if(h.length>=15&&e.time-a.time<500&&a.delta-e.delta>=1&&e.delta<=6){const s=c>0?.8:.2;o=e,h.splice(0),l=p((()=>{t.slideToClosest(t.params.speed,!0,void 0,s)}),0)}l||(l=p((()=>{o=e,h.splice(0),t.slideToClosest(t.params.speed,!0,void 0,.5)}),500))}if(a||i("scroll",s),t.params.autoplay&&t.params.autoplayDisableOnInteraction&&t.autoplay.stop(),n===t.minTranslate()||n===t.maxTranslate())return!0}}else{const s={time:u(),delta:Math.abs(c),direction:Math.sign(c),raw:e};h.length>=2&&h.shift();const a=h.length?h[h.length-1]:void 0;if(h.push(s),a?(s.direction!==a.direction||s.delta>a.delta||s.time>a.time+150)&&g(s):g(s),function(e){const s=t.params.mousewheel;if(e.direction<0){if(t.isEnd&&!t.params.loop&&s.releaseOnEdges)return!0}else if(t.isBeginning&&!t.params.loop&&s.releaseOnEdges)return!0;return!1}(s))return!0}return s.preventDefault?s.preventDefault():s.returnValue=!1,!1}function w(e){let s=t.$el;"container"!==t.params.mousewheel.eventsTarget&&(s=d(t.params.mousewheel.eventsTarget)),s[e]("mouseenter",m),s[e]("mouseleave",f),s[e]("wheel",v)}function b(){return t.params.cssMode?(t.wrapperEl.removeEventListener("wheel",v),!0):!t.mousewheel.enabled&&(w("on"),t.mousewheel.enabled=!0,!0)}function x(){return t.params.cssMode?(t.wrapperEl.addEventListener(event,v),!0):!!t.mousewheel.enabled&&(w("off"),t.mousewheel.enabled=!1,!0)}a("init",(()=>{!t.params.mousewheel.enabled&&t.params.cssMode&&x(),t.params.mousewheel.enabled&&b()})),a("destroy",(()=>{t.params.cssMode&&b(),t.mousewheel.enabled&&x()})),Object.assign(t.mousewheel,{enable:b,disable:x})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;function r(e){let s;return e&&(s=d(e),t.params.uniqueNavElements&&"string"==typeof e&&s.length>1&&1===t.$el.find(e).length&&(s=t.$el.find(e))),s}function n(e,s){const a=t.params.navigation;e&&e.length>0&&(e[s?"addClass":"removeClass"](a.disabledClass),e[0]&&"BUTTON"===e[0].tagName&&(e[0].disabled=s),t.params.watchOverflow&&t.enabled&&e[t.isLocked?"addClass":"removeClass"](a.lockClass))}function l(){if(t.params.loop)return;const{$nextEl:e,$prevEl:s}=t.navigation;n(s,t.isBeginning&&!t.params.rewind),n(e,t.isEnd&&!t.params.rewind)}function o(e){e.preventDefault(),(!t.isBeginning||t.params.loop||t.params.rewind)&&(t.slidePrev(),i("navigationPrev"))}function c(e){e.preventDefault(),(!t.isEnd||t.params.loop||t.params.rewind)&&(t.slideNext(),i("navigationNext"))}function p(){const e=t.params.navigation;if(t.params.navigation=F(t,t.originalParams.navigation,t.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),!e.nextEl&&!e.prevEl)return;const s=r(e.nextEl),a=r(e.prevEl);s&&s.length>0&&s.on("click",c),a&&a.length>0&&a.on("click",o),Object.assign(t.navigation,{$nextEl:s,nextEl:s&&s[0],$prevEl:a,prevEl:a&&a[0]}),t.enabled||(s&&s.addClass(e.lockClass),a&&a.addClass(e.lockClass))}function u(){const{$nextEl:e,$prevEl:s}=t.navigation;e&&e.length&&(e.off("click",c),e.removeClass(t.params.navigation.disabledClass)),s&&s.length&&(s.off("click",o),s.removeClass(t.params.navigation.disabledClass))}s({navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock",navigationDisabledClass:"swiper-navigation-disabled"}}),t.navigation={nextEl:null,$nextEl:null,prevEl:null,$prevEl:null},a("init",(()=>{!1===t.params.navigation.enabled?h():(p(),l())})),a("toEdge fromEdge lock unlock",(()=>{l()})),a("destroy",(()=>{u()})),a("enable disable",(()=>{const{$nextEl:e,$prevEl:s}=t.navigation;e&&e[t.enabled?"removeClass":"addClass"](t.params.navigation.lockClass),s&&s[t.enabled?"removeClass":"addClass"](t.params.navigation.lockClass)})),a("click",((e,s)=>{const{$nextEl:a,$prevEl:r}=t.navigation,n=s.target;if(t.params.navigation.hideOnClick&&!d(n).is(r)&&!d(n).is(a)){if(t.pagination&&t.params.pagination&&t.params.pagination.clickable&&(t.pagination.el===n||t.pagination.el.contains(n)))return;let e;a?e=a.hasClass(t.params.navigation.hiddenClass):r&&(e=r.hasClass(t.params.navigation.hiddenClass)),i(!0===e?"navigationShow":"navigationHide"),a&&a.toggleClass(t.params.navigation.hiddenClass),r&&r.toggleClass(t.params.navigation.hiddenClass)}}));const h=()=>{t.$el.addClass(t.params.navigation.navigationDisabledClass),u()};Object.assign(t.navigation,{enable:()=>{t.$el.removeClass(t.params.navigation.navigationDisabledClass),p(),l()},disable:h,update:l,init:p,destroy:u})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const r="swiper-pagination";let n;s({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${r}-bullet`,bulletActiveClass:`${r}-bullet-active`,modifierClass:`${r}-`,currentClass:`${r}-current`,totalClass:`${r}-total`,hiddenClass:`${r}-hidden`,progressbarFillClass:`${r}-progressbar-fill`,progressbarOppositeClass:`${r}-progressbar-opposite`,clickableClass:`${r}-clickable`,lockClass:`${r}-lock`,horizontalClass:`${r}-horizontal`,verticalClass:`${r}-vertical`,paginationDisabledClass:`${r}-disabled`}}),t.pagination={el:null,$el:null,bullets:[]};let l=0;function o(){return!t.params.pagination.el||!t.pagination.el||!t.pagination.$el||0===t.pagination.$el.length}function c(e,s){const{bulletActiveClass:a}=t.params.pagination;e[s]().addClass(`${a}-${s}`)[s]().addClass(`${a}-${s}-${s}`)}function p(){const e=t.rtl,s=t.params.pagination;if(o())return;const a=t.virtual&&t.params.virtual.enabled?t.virtual.slides.length:t.slides.length,r=t.pagination.$el;let p;const u=t.params.loop?Math.ceil((a-2*t.loopedSlides)/t.params.slidesPerGroup):t.snapGrid.length;if(t.params.loop?(p=Math.ceil((t.activeIndex-t.loopedSlides)/t.params.slidesPerGroup),p>a-1-2*t.loopedSlides&&(p-=a-2*t.loopedSlides),p>u-1&&(p-=u),p<0&&"bullets"!==t.params.paginationType&&(p=u+p)):p=void 0!==t.snapIndex?t.snapIndex:t.activeIndex||0,"bullets"===s.type&&t.pagination.bullets&&t.pagination.bullets.length>0){const a=t.pagination.bullets;let i,o,u;if(s.dynamicBullets&&(n=a.eq(0)[t.isHorizontal()?"outerWidth":"outerHeight"](!0),r.css(t.isHorizontal()?"width":"height",n*(s.dynamicMainBullets+4)+"px"),s.dynamicMainBullets>1&&void 0!==t.previousIndex&&(l+=p-(t.previousIndex-t.loopedSlides||0),l>s.dynamicMainBullets-1?l=s.dynamicMainBullets-1:l<0&&(l=0)),i=Math.max(p-l,0),o=i+(Math.min(a.length,s.dynamicMainBullets)-1),u=(o+i)/2),a.removeClass(["","-next","-next-next","-prev","-prev-prev","-main"].map((e=>`${s.bulletActiveClass}${e}`)).join(" ")),r.length>1)a.each((e=>{const t=d(e),a=t.index();a===p&&t.addClass(s.bulletActiveClass),s.dynamicBullets&&(a>=i&&a<=o&&t.addClass(`${s.bulletActiveClass}-main`),a===i&&c(t,"prev"),a===o&&c(t,"next"))}));else{const e=a.eq(p),r=e.index();if(e.addClass(s.bulletActiveClass),s.dynamicBullets){const e=a.eq(i),n=a.eq(o);for(let e=i;e<=o;e+=1)a.eq(e).addClass(`${s.bulletActiveClass}-main`);if(t.params.loop)if(r>=a.length){for(let e=s.dynamicMainBullets;e>=0;e-=1)a.eq(a.length-e).addClass(`${s.bulletActiveClass}-main`);a.eq(a.length-s.dynamicMainBullets-1).addClass(`${s.bulletActiveClass}-prev`)}else c(e,"prev"),c(n,"next");else c(e,"prev"),c(n,"next")}}if(s.dynamicBullets){const i=Math.min(a.length,s.dynamicMainBullets+4),r=(n*i-n)/2-u*n,l=e?"right":"left";a.css(t.isHorizontal()?l:"top",`${r}px`)}}if("fraction"===s.type&&(r.find(U(s.currentClass)).text(s.formatFractionCurrent(p+1)),r.find(U(s.totalClass)).text(s.formatFractionTotal(u))),"progressbar"===s.type){let e;e=s.progressbarOpposite?t.isHorizontal()?"vertical":"horizontal":t.isHorizontal()?"horizontal":"vertical";const a=(p+1)/u;let i=1,n=1;"horizontal"===e?i=a:n=a,r.find(U(s.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${i}) scaleY(${n})`).transition(t.params.speed)}"custom"===s.type&&s.renderCustom?(r.html(s.renderCustom(t,p+1,u)),i("paginationRender",r[0])):i("paginationUpdate",r[0]),t.params.watchOverflow&&t.enabled&&r[t.isLocked?"addClass":"removeClass"](s.lockClass)}function u(){const e=t.params.pagination;if(o())return;const s=t.virtual&&t.params.virtual.enabled?t.virtual.slides.length:t.slides.length,a=t.pagination.$el;let r="";if("bullets"===e.type){let i=t.params.loop?Math.ceil((s-2*t.loopedSlides)/t.params.slidesPerGroup):t.snapGrid.length;t.params.freeMode&&t.params.freeMode.enabled&&!t.params.loop&&i>s&&(i=s);for(let s=0;s`;a.html(r),t.pagination.bullets=a.find(U(e.bulletClass))}"fraction"===e.type&&(r=e.renderFraction?e.renderFraction.call(t,e.currentClass,e.totalClass):` / `,a.html(r)),"progressbar"===e.type&&(r=e.renderProgressbar?e.renderProgressbar.call(t,e.progressbarFillClass):``,a.html(r)),"custom"!==e.type&&i("paginationRender",t.pagination.$el[0])}function h(){t.params.pagination=F(t,t.originalParams.pagination,t.params.pagination,{el:"swiper-pagination"});const e=t.params.pagination;if(!e.el)return;let s=d(e.el);0!==s.length&&(t.params.uniqueNavElements&&"string"==typeof e.el&&s.length>1&&(s=t.$el.find(e.el),s.length>1&&(s=s.filter((e=>d(e).parents(".swiper")[0]===t.el)))),"bullets"===e.type&&e.clickable&&s.addClass(e.clickableClass),s.addClass(e.modifierClass+e.type),s.addClass(t.isHorizontal()?e.horizontalClass:e.verticalClass),"bullets"===e.type&&e.dynamicBullets&&(s.addClass(`${e.modifierClass}${e.type}-dynamic`),l=0,e.dynamicMainBullets<1&&(e.dynamicMainBullets=1)),"progressbar"===e.type&&e.progressbarOpposite&&s.addClass(e.progressbarOppositeClass),e.clickable&&s.on("click",U(e.bulletClass),(function(e){e.preventDefault();let s=d(this).index()*t.params.slidesPerGroup;t.params.loop&&(s+=t.loopedSlides),t.slideTo(s)})),Object.assign(t.pagination,{$el:s,el:s[0]}),t.enabled||s.addClass(e.lockClass))}function m(){const e=t.params.pagination;if(o())return;const s=t.pagination.$el;s.removeClass(e.hiddenClass),s.removeClass(e.modifierClass+e.type),s.removeClass(t.isHorizontal()?e.horizontalClass:e.verticalClass),t.pagination.bullets&&t.pagination.bullets.removeClass&&t.pagination.bullets.removeClass(e.bulletActiveClass),e.clickable&&s.off("click",U(e.bulletClass))}a("init",(()=>{!1===t.params.pagination.enabled?f():(h(),u(),p())})),a("activeIndexChange",(()=>{(t.params.loop||void 0===t.snapIndex)&&p()})),a("snapIndexChange",(()=>{t.params.loop||p()})),a("slidesLengthChange",(()=>{t.params.loop&&(u(),p())})),a("snapGridLengthChange",(()=>{t.params.loop||(u(),p())})),a("destroy",(()=>{m()})),a("enable disable",(()=>{const{$el:e}=t.pagination;e&&e[t.enabled?"removeClass":"addClass"](t.params.pagination.lockClass)})),a("lock unlock",(()=>{p()})),a("click",((e,s)=>{const a=s.target,{$el:r}=t.pagination;if(t.params.pagination.el&&t.params.pagination.hideOnClick&&r&&r.length>0&&!d(a).hasClass(t.params.pagination.bulletClass)){if(t.navigation&&(t.navigation.nextEl&&a===t.navigation.nextEl||t.navigation.prevEl&&a===t.navigation.prevEl))return;const e=r.hasClass(t.params.pagination.hiddenClass);i(!0===e?"paginationShow":"paginationHide"),r.toggleClass(t.params.pagination.hiddenClass)}}));const f=()=>{t.$el.addClass(t.params.pagination.paginationDisabledClass),t.pagination.$el&&t.pagination.$el.addClass(t.params.pagination.paginationDisabledClass),m()};Object.assign(t.pagination,{enable:()=>{t.$el.removeClass(t.params.pagination.paginationDisabledClass),t.pagination.$el&&t.pagination.$el.removeClass(t.params.pagination.paginationDisabledClass),h(),u(),p()},disable:f,render:u,update:p,init:h,destroy:m})},function(e){let{swiper:t,extendParams:s,on:i,emit:r}=e;const n=a();let l,o,c,u,h=!1,m=null,f=null;function g(){if(!t.params.scrollbar.el||!t.scrollbar.el)return;const{scrollbar:e,rtlTranslate:s,progress:a}=t,{$dragEl:i,$el:r}=e,n=t.params.scrollbar;let l=o,d=(c-o)*a;s?(d=-d,d>0?(l=o-d,d=0):-d+o>c&&(l=c+d)):d<0?(l=o+d,d=0):d+o>c&&(l=c-d),t.isHorizontal()?(i.transform(`translate3d(${d}px, 0, 0)`),i[0].style.width=`${l}px`):(i.transform(`translate3d(0px, ${d}px, 0)`),i[0].style.height=`${l}px`),n.hide&&(clearTimeout(m),r[0].style.opacity=1,m=setTimeout((()=>{r[0].style.opacity=0,r.transition(400)}),1e3))}function v(){if(!t.params.scrollbar.el||!t.scrollbar.el)return;const{scrollbar:e}=t,{$dragEl:s,$el:a}=e;s[0].style.width="",s[0].style.height="",c=t.isHorizontal()?a[0].offsetWidth:a[0].offsetHeight,u=t.size/(t.virtualSize+t.params.slidesOffsetBefore-(t.params.centeredSlides?t.snapGrid[0]:0)),o="auto"===t.params.scrollbar.dragSize?c*u:parseInt(t.params.scrollbar.dragSize,10),t.isHorizontal()?s[0].style.width=`${o}px`:s[0].style.height=`${o}px`,a[0].style.display=u>=1?"none":"",t.params.scrollbar.hide&&(a[0].style.opacity=0),t.params.watchOverflow&&t.enabled&&e.$el[t.isLocked?"addClass":"removeClass"](t.params.scrollbar.lockClass)}function w(e){return t.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientX:e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientY:e.clientY}function b(e){const{scrollbar:s,rtlTranslate:a}=t,{$el:i}=s;let r;r=(w(e)-i.offset()[t.isHorizontal()?"left":"top"]-(null!==l?l:o/2))/(c-o),r=Math.max(Math.min(r,1),0),a&&(r=1-r);const n=t.minTranslate()+(t.maxTranslate()-t.minTranslate())*r;t.updateProgress(n),t.setTranslate(n),t.updateActiveIndex(),t.updateSlidesClasses()}function x(e){const s=t.params.scrollbar,{scrollbar:a,$wrapperEl:i}=t,{$el:n,$dragEl:o}=a;h=!0,l=e.target===o[0]||e.target===o?w(e)-e.target.getBoundingClientRect()[t.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),i.transition(100),o.transition(100),b(e),clearTimeout(f),n.transition(0),s.hide&&n.css("opacity",1),t.params.cssMode&&t.$wrapperEl.css("scroll-snap-type","none"),r("scrollbarDragStart",e)}function y(e){const{scrollbar:s,$wrapperEl:a}=t,{$el:i,$dragEl:n}=s;h&&(e.preventDefault?e.preventDefault():e.returnValue=!1,b(e),a.transition(0),i.transition(0),n.transition(0),r("scrollbarDragMove",e))}function E(e){const s=t.params.scrollbar,{scrollbar:a,$wrapperEl:i}=t,{$el:n}=a;h&&(h=!1,t.params.cssMode&&(t.$wrapperEl.css("scroll-snap-type",""),i.transition("")),s.hide&&(clearTimeout(f),f=p((()=>{n.css("opacity",0),n.transition(400)}),1e3)),r("scrollbarDragEnd",e),s.snapOnRelease&&t.slideToClosest())}function C(e){const{scrollbar:s,touchEventsTouch:a,touchEventsDesktop:i,params:r,support:l}=t,o=s.$el;if(!o)return;const d=o[0],c=!(!l.passiveListener||!r.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!r.passiveListeners)&&{passive:!0,capture:!1};if(!d)return;const u="on"===e?"addEventListener":"removeEventListener";l.touch?(d[u](a.start,x,c),d[u](a.move,y,c),d[u](a.end,E,p)):(d[u](i.start,x,c),n[u](i.move,y,c),n[u](i.end,E,p))}function T(){const{scrollbar:e,$el:s}=t;t.params.scrollbar=F(t,t.originalParams.scrollbar,t.params.scrollbar,{el:"swiper-scrollbar"});const a=t.params.scrollbar;if(!a.el)return;let i=d(a.el);t.params.uniqueNavElements&&"string"==typeof a.el&&i.length>1&&1===s.find(a.el).length&&(i=s.find(a.el)),i.addClass(t.isHorizontal()?a.horizontalClass:a.verticalClass);let r=i.find(`.${t.params.scrollbar.dragClass}`);0===r.length&&(r=d(`
`),i.append(r)),Object.assign(e,{$el:i,el:i[0],$dragEl:r,dragEl:r[0]}),a.draggable&&t.params.scrollbar.el&&t.scrollbar.el&&C("on"),i&&i[t.enabled?"removeClass":"addClass"](t.params.scrollbar.lockClass)}function $(){const e=t.params.scrollbar,s=t.scrollbar.$el;s&&s.removeClass(t.isHorizontal()?e.horizontalClass:e.verticalClass),t.params.scrollbar.el&&t.scrollbar.el&&C("off")}s({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag",scrollbarDisabledClass:"swiper-scrollbar-disabled",horizontalClass:"swiper-scrollbar-horizontal",verticalClass:"swiper-scrollbar-vertical"}}),t.scrollbar={el:null,dragEl:null,$el:null,$dragEl:null},i("init",(()=>{!1===t.params.scrollbar.enabled?S():(T(),v(),g())})),i("update resize observerUpdate lock unlock",(()=>{v()})),i("setTranslate",(()=>{g()})),i("setTransition",((e,s)=>{!function(e){t.params.scrollbar.el&&t.scrollbar.el&&t.scrollbar.$dragEl.transition(e)}(s)})),i("enable disable",(()=>{const{$el:e}=t.scrollbar;e&&e[t.enabled?"removeClass":"addClass"](t.params.scrollbar.lockClass)})),i("destroy",(()=>{$()}));const S=()=>{t.$el.addClass(t.params.scrollbar.scrollbarDisabledClass),t.scrollbar.$el&&t.scrollbar.$el.addClass(t.params.scrollbar.scrollbarDisabledClass),$()};Object.assign(t.scrollbar,{enable:()=>{t.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass),t.scrollbar.$el&&t.scrollbar.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass),T(),v(),g()},disable:S,updateSize:v,setTranslate:g,init:T,destroy:$})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({parallax:{enabled:!1}});const i=(e,s)=>{const{rtl:a}=t,i=d(e),r=a?-1:1,n=i.attr("data-swiper-parallax")||"0";let l=i.attr("data-swiper-parallax-x"),o=i.attr("data-swiper-parallax-y");const c=i.attr("data-swiper-parallax-scale"),p=i.attr("data-swiper-parallax-opacity");if(l||o?(l=l||"0",o=o||"0"):t.isHorizontal()?(l=n,o="0"):(o=n,l="0"),l=l.indexOf("%")>=0?parseInt(l,10)*s*r+"%":l*s*r+"px",o=o.indexOf("%")>=0?parseInt(o,10)*s+"%":o*s+"px",null!=p){const e=p-(p-1)*(1-Math.abs(s));i[0].style.opacity=e}if(null==c)i.transform(`translate3d(${l}, ${o}, 0px)`);else{const e=c-(c-1)*(1-Math.abs(s));i.transform(`translate3d(${l}, ${o}, 0px) scale(${e})`)}},r=()=>{const{$el:e,slides:s,progress:a,snapGrid:r}=t;e.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{i(e,a)})),s.each(((e,s)=>{let n=e.progress;t.params.slidesPerGroup>1&&"auto"!==t.params.slidesPerView&&(n+=Math.ceil(s/2)-a*(r.length-1)),n=Math.min(Math.max(n,-1),1),d(e).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e=>{i(e,n)}))}))};a("beforeInit",(()=>{t.params.parallax.enabled&&(t.params.watchSlidesProgress=!0,t.originalParams.watchSlidesProgress=!0)})),a("init",(()=>{t.params.parallax.enabled&&r()})),a("setTranslate",(()=>{t.params.parallax.enabled&&r()})),a("setTransition",((e,s)=>{t.params.parallax.enabled&&function(e){void 0===e&&(e=t.params.speed);const{$el:s}=t;s.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((t=>{const s=d(t);let a=parseInt(s.attr("data-swiper-parallax-duration"),10)||e;0===e&&(a=0),s.transition(a)}))}(s)}))},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=r();s({zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),t.zoom={enabled:!1};let l,o,c,p=1,u=!1;const m={$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},f={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},g={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let v=1;function w(e){if(e.targetTouches.length<2)return 1;const t=e.targetTouches[0].pageX,s=e.targetTouches[0].pageY,a=e.targetTouches[1].pageX,i=e.targetTouches[1].pageY;return Math.sqrt((a-t)**2+(i-s)**2)}function b(e){const s=t.support,a=t.params.zoom;if(o=!1,c=!1,!s.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;o=!0,m.scaleStart=w(e)}m.$slideEl&&m.$slideEl.length||(m.$slideEl=d(e.target).closest(`.${t.params.slideClass}`),0===m.$slideEl.length&&(m.$slideEl=t.slides.eq(t.activeIndex)),m.$imageEl=m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0),m.$imageWrapEl=m.$imageEl.parent(`.${a.containerClass}`),m.maxRatio=m.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,0!==m.$imageWrapEl.length)?(m.$imageEl&&m.$imageEl.transition(0),u=!0):m.$imageEl=void 0}function x(e){const s=t.support,a=t.params.zoom,i=t.zoom;if(!s.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;c=!0,m.scaleMove=w(e)}m.$imageEl&&0!==m.$imageEl.length?(s.gestures?i.scale=e.scale*p:i.scale=m.scaleMove/m.scaleStart*p,i.scale>m.maxRatio&&(i.scale=m.maxRatio-1+(i.scale-m.maxRatio+1)**.5),i.scalef.touchesStart.x))return void(f.isTouched=!1);if(!t.isHorizontal()&&(Math.floor(f.minY)===Math.floor(f.startY)&&f.touchesCurrent.yf.touchesStart.y))return void(f.isTouched=!1)}e.cancelable&&e.preventDefault(),e.stopPropagation(),f.isMoved=!0,f.currentX=f.touchesCurrent.x-f.touchesStart.x+f.startX,f.currentY=f.touchesCurrent.y-f.touchesStart.y+f.startY,f.currentXf.maxX&&(f.currentX=f.maxX-1+(f.currentX-f.maxX+1)**.8),f.currentYf.maxY&&(f.currentY=f.maxY-1+(f.currentY-f.maxY+1)**.8),g.prevPositionX||(g.prevPositionX=f.touchesCurrent.x),g.prevPositionY||(g.prevPositionY=f.touchesCurrent.y),g.prevTime||(g.prevTime=Date.now()),g.x=(f.touchesCurrent.x-g.prevPositionX)/(Date.now()-g.prevTime)/2,g.y=(f.touchesCurrent.y-g.prevPositionY)/(Date.now()-g.prevTime)/2,Math.abs(f.touchesCurrent.x-g.prevPositionX)<2&&(g.x=0),Math.abs(f.touchesCurrent.y-g.prevPositionY)<2&&(g.y=0),g.prevPositionX=f.touchesCurrent.x,g.prevPositionY=f.touchesCurrent.y,g.prevTime=Date.now(),m.$imageWrapEl.transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`)}}function C(){const e=t.zoom;m.$slideEl&&t.previousIndex!==t.activeIndex&&(m.$imageEl&&m.$imageEl.transform("translate3d(0,0,0) scale(1)"),m.$imageWrapEl&&m.$imageWrapEl.transform("translate3d(0,0,0)"),e.scale=1,p=1,m.$slideEl=void 0,m.$imageEl=void 0,m.$imageWrapEl=void 0)}function T(e){const s=t.zoom,a=t.params.zoom;if(m.$slideEl||(e&&e.target&&(m.$slideEl=d(e.target).closest(`.${t.params.slideClass}`)),m.$slideEl||(t.params.virtual&&t.params.virtual.enabled&&t.virtual?m.$slideEl=t.$wrapperEl.children(`.${t.params.slideActiveClass}`):m.$slideEl=t.slides.eq(t.activeIndex)),m.$imageEl=m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0),m.$imageWrapEl=m.$imageEl.parent(`.${a.containerClass}`)),!m.$imageEl||0===m.$imageEl.length||!m.$imageWrapEl||0===m.$imageWrapEl.length)return;let i,r,l,o,c,u,h,g,v,w,b,x,y,E,C,T,$,S;t.params.cssMode&&(t.wrapperEl.style.overflow="hidden",t.wrapperEl.style.touchAction="none"),m.$slideEl.addClass(`${a.zoomedSlideClass}`),void 0===f.touchesStart.x&&e?(i="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,r="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(i=f.touchesStart.x,r=f.touchesStart.y),s.scale=m.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,p=m.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,e?($=m.$slideEl[0].offsetWidth,S=m.$slideEl[0].offsetHeight,l=m.$slideEl.offset().left+n.scrollX,o=m.$slideEl.offset().top+n.scrollY,c=l+$/2-i,u=o+S/2-r,v=m.$imageEl[0].offsetWidth,w=m.$imageEl[0].offsetHeight,b=v*s.scale,x=w*s.scale,y=Math.min($/2-b/2,0),E=Math.min(S/2-x/2,0),C=-y,T=-E,h=c*s.scale,g=u*s.scale,hC&&(h=C),gT&&(g=T)):(h=0,g=0),m.$imageWrapEl.transition(300).transform(`translate3d(${h}px, ${g}px,0)`),m.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${s.scale})`)}function $(){const e=t.zoom,s=t.params.zoom;m.$slideEl||(t.params.virtual&&t.params.virtual.enabled&&t.virtual?m.$slideEl=t.$wrapperEl.children(`.${t.params.slideActiveClass}`):m.$slideEl=t.slides.eq(t.activeIndex),m.$imageEl=m.$slideEl.find(`.${s.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0),m.$imageWrapEl=m.$imageEl.parent(`.${s.containerClass}`)),m.$imageEl&&0!==m.$imageEl.length&&m.$imageWrapEl&&0!==m.$imageWrapEl.length&&(t.params.cssMode&&(t.wrapperEl.style.overflow="",t.wrapperEl.style.touchAction=""),e.scale=1,p=1,m.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),m.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),m.$slideEl.removeClass(`${s.zoomedSlideClass}`),m.$slideEl=void 0)}function S(e){const s=t.zoom;s.scale&&1!==s.scale?$():T(e)}function M(){const e=t.support;return{passiveListener:!("touchstart"!==t.touchEvents.start||!e.passiveListener||!t.params.passiveListeners)&&{passive:!0,capture:!1},activeListenerWithCapture:!e.passiveListener||{passive:!1,capture:!0}}}function P(){return`.${t.params.slideClass}`}function k(e){const{passiveListener:s}=M(),a=P();t.$wrapperEl[e]("gesturestart",a,b,s),t.$wrapperEl[e]("gesturechange",a,x,s),t.$wrapperEl[e]("gestureend",a,y,s)}function z(){l||(l=!0,k("on"))}function L(){l&&(l=!1,k("off"))}function O(){const e=t.zoom;if(e.enabled)return;e.enabled=!0;const s=t.support,{passiveListener:a,activeListenerWithCapture:i}=M(),r=P();s.gestures?(t.$wrapperEl.on(t.touchEvents.start,z,a),t.$wrapperEl.on(t.touchEvents.end,L,a)):"touchstart"===t.touchEvents.start&&(t.$wrapperEl.on(t.touchEvents.start,r,b,a),t.$wrapperEl.on(t.touchEvents.move,r,x,i),t.$wrapperEl.on(t.touchEvents.end,r,y,a),t.touchEvents.cancel&&t.$wrapperEl.on(t.touchEvents.cancel,r,y,a)),t.$wrapperEl.on(t.touchEvents.move,`.${t.params.zoom.containerClass}`,E,i)}function I(){const e=t.zoom;if(!e.enabled)return;const s=t.support;e.enabled=!1;const{passiveListener:a,activeListenerWithCapture:i}=M(),r=P();s.gestures?(t.$wrapperEl.off(t.touchEvents.start,z,a),t.$wrapperEl.off(t.touchEvents.end,L,a)):"touchstart"===t.touchEvents.start&&(t.$wrapperEl.off(t.touchEvents.start,r,b,a),t.$wrapperEl.off(t.touchEvents.move,r,x,i),t.$wrapperEl.off(t.touchEvents.end,r,y,a),t.touchEvents.cancel&&t.$wrapperEl.off(t.touchEvents.cancel,r,y,a)),t.$wrapperEl.off(t.touchEvents.move,`.${t.params.zoom.containerClass}`,E,i)}Object.defineProperty(t.zoom,"scale",{get:()=>v,set(e){if(v!==e){const t=m.$imageEl?m.$imageEl[0]:void 0,s=m.$slideEl?m.$slideEl[0]:void 0;i("zoomChange",e,t,s)}v=e}}),a("init",(()=>{t.params.zoom.enabled&&O()})),a("destroy",(()=>{I()})),a("touchStart",((e,s)=>{t.zoom.enabled&&function(e){const s=t.device;m.$imageEl&&0!==m.$imageEl.length&&(f.isTouched||(s.android&&e.cancelable&&e.preventDefault(),f.isTouched=!0,f.touchesStart.x="touchstart"===e.type?e.targetTouches[0].pageX:e.pageX,f.touchesStart.y="touchstart"===e.type?e.targetTouches[0].pageY:e.pageY))}(s)})),a("touchEnd",((e,s)=>{t.zoom.enabled&&function(){const e=t.zoom;if(!m.$imageEl||0===m.$imageEl.length)return;if(!f.isTouched||!f.isMoved)return f.isTouched=!1,void(f.isMoved=!1);f.isTouched=!1,f.isMoved=!1;let s=300,a=300;const i=g.x*s,r=f.currentX+i,n=g.y*a,l=f.currentY+n;0!==g.x&&(s=Math.abs((r-f.currentX)/g.x)),0!==g.y&&(a=Math.abs((l-f.currentY)/g.y));const o=Math.max(s,a);f.currentX=r,f.currentY=l;const d=f.width*e.scale,c=f.height*e.scale;f.minX=Math.min(m.slideWidth/2-d/2,0),f.maxX=-f.minX,f.minY=Math.min(m.slideHeight/2-c/2,0),f.maxY=-f.minY,f.currentX=Math.max(Math.min(f.currentX,f.maxX),f.minX),f.currentY=Math.max(Math.min(f.currentY,f.maxY),f.minY),m.$imageWrapEl.transition(o).transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`)}()})),a("doubleTap",((e,s)=>{!t.animating&&t.params.zoom.enabled&&t.zoom.enabled&&t.params.zoom.toggle&&S(s)})),a("transitionEnd",(()=>{t.zoom.enabled&&t.params.zoom.enabled&&C()})),a("slideChange",(()=>{t.zoom.enabled&&t.params.zoom.enabled&&t.params.cssMode&&C()})),Object.assign(t.zoom,{enable:O,disable:I,in:T,out:$,toggle:S})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;s({lazy:{checkInView:!1,enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,scrollingElement:"",elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}}),t.lazy={};let n=!1,l=!1;function o(e,s){void 0===s&&(s=!0);const a=t.params.lazy;if(void 0===e)return;if(0===t.slides.length)return;const r=t.virtual&&t.params.virtual.enabled?t.$wrapperEl.children(`.${t.params.slideClass}[data-swiper-slide-index="${e}"]`):t.slides.eq(e),n=r.find(`.${a.elementClass}:not(.${a.loadedClass}):not(.${a.loadingClass})`);!r.hasClass(a.elementClass)||r.hasClass(a.loadedClass)||r.hasClass(a.loadingClass)||n.push(r[0]),0!==n.length&&n.each((e=>{const n=d(e);n.addClass(a.loadingClass);const l=n.attr("data-background"),c=n.attr("data-src"),p=n.attr("data-srcset"),u=n.attr("data-sizes"),h=n.parent("picture");t.loadImage(n[0],c||l,p,u,!1,(()=>{if(null!=t&&t&&(!t||t.params)&&!t.destroyed){if(l?(n.css("background-image",`url("${l}")`),n.removeAttr("data-background")):(p&&(n.attr("srcset",p),n.removeAttr("data-srcset")),u&&(n.attr("sizes",u),n.removeAttr("data-sizes")),h.length&&h.children("source").each((e=>{const t=d(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),c&&(n.attr("src",c),n.removeAttr("data-src"))),n.addClass(a.loadedClass).removeClass(a.loadingClass),r.find(`.${a.preloaderClass}`).remove(),t.params.loop&&s){const e=r.attr("data-swiper-slide-index");if(r.hasClass(t.params.slideDuplicateClass)){o(t.$wrapperEl.children(`[data-swiper-slide-index="${e}"]:not(.${t.params.slideDuplicateClass})`).index(),!1)}else{o(t.$wrapperEl.children(`.${t.params.slideDuplicateClass}[data-swiper-slide-index="${e}"]`).index(),!1)}}i("lazyImageReady",r[0],n[0]),t.params.autoHeight&&t.updateAutoHeight()}})),i("lazyImageLoad",r[0],n[0])}))}function c(){const{$wrapperEl:e,params:s,slides:a,activeIndex:i}=t,r=t.virtual&&s.virtual.enabled,n=s.lazy;let c=s.slidesPerView;function p(t){if(r){if(e.children(`.${s.slideClass}[data-swiper-slide-index="${t}"]`).length)return!0}else if(a[t])return!0;return!1}function u(e){return r?d(e).attr("data-swiper-slide-index"):d(e).index()}if("auto"===c&&(c=0),l||(l=!0),t.params.watchSlidesProgress)e.children(`.${s.slideVisibleClass}`).each((e=>{o(r?d(e).attr("data-swiper-slide-index"):d(e).index())}));else if(c>1)for(let e=i;e1||n.loadPrevNextAmount&&n.loadPrevNextAmount>1){const e=n.loadPrevNextAmount,t=Math.ceil(c),s=Math.min(i+t+Math.max(e,t),a.length),r=Math.max(i-Math.max(t,e),0);for(let e=i+t;e0&&o(u(t));const a=e.children(`.${s.slidePrevClass}`);a.length>0&&o(u(a))}}function p(){const e=r();if(!t||t.destroyed)return;const s=t.params.lazy.scrollingElement?d(t.params.lazy.scrollingElement):d(e),a=s[0]===e,i=a?e.innerWidth:s[0].offsetWidth,l=a?e.innerHeight:s[0].offsetHeight,o=t.$el.offset(),{rtlTranslate:u}=t;let h=!1;u&&(o.left-=t.$el[0].scrollLeft);const m=[[o.left,o.top],[o.left+t.width,o.top],[o.left,o.top+t.height],[o.left+t.width,o.top+t.height]];for(let e=0;e=0&&t[0]<=i&&t[1]>=0&&t[1]<=l){if(0===t[0]&&0===t[1])continue;h=!0}}const f=!("touchstart"!==t.touchEvents.start||!t.support.passiveListener||!t.params.passiveListeners)&&{passive:!0,capture:!1};h?(c(),s.off("scroll",p,f)):n||(n=!0,s.on("scroll",p,f))}a("beforeInit",(()=>{t.params.lazy.enabled&&t.params.preloadImages&&(t.params.preloadImages=!1)})),a("init",(()=>{t.params.lazy.enabled&&(t.params.lazy.checkInView?p():c())})),a("scroll",(()=>{t.params.freeMode&&t.params.freeMode.enabled&&!t.params.freeMode.sticky&&c()})),a("scrollbarDragMove resize _freeModeNoMomentumRelease",(()=>{t.params.lazy.enabled&&(t.params.lazy.checkInView?p():c())})),a("transitionStart",(()=>{t.params.lazy.enabled&&(t.params.lazy.loadOnTransitionStart||!t.params.lazy.loadOnTransitionStart&&!l)&&(t.params.lazy.checkInView?p():c())})),a("transitionEnd",(()=>{t.params.lazy.enabled&&!t.params.lazy.loadOnTransitionStart&&(t.params.lazy.checkInView?p():c())})),a("slideChange",(()=>{const{lazy:e,cssMode:s,watchSlidesProgress:a,touchReleaseOnEdges:i,resistanceRatio:r}=t.params;e.enabled&&(s||a&&(i||0===r))&&c()})),a("destroy",(()=>{t.$el&&t.$el.find(`.${t.params.lazy.loadingClass}`).removeClass(t.params.lazy.loadingClass)})),Object.assign(t.lazy,{load:c,loadInSlide:o})},function(e){let{swiper:t,extendParams:s,on:a}=e;function i(e,t){const s=function(){let e,t,s;return(a,i)=>{for(t=-1,e=a.length;e-t>1;)s=e+t>>1,a[s]<=i?t=s:e=s;return e}}();let a,i;return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(i=s(this.x,e),a=i-1,(e-this.x[a])*(this.y[i]-this.y[a])/(this.x[i]-this.x[a])+this.y[a]):0},this}function r(){t.controller.control&&t.controller.spline&&(t.controller.spline=void 0,delete t.controller.spline)}s({controller:{control:void 0,inverse:!1,by:"slide"}}),t.controller={control:void 0},a("beforeInit",(()=>{t.controller.control=t.params.controller.control})),a("update",(()=>{r()})),a("resize",(()=>{r()})),a("observerUpdate",(()=>{r()})),a("setTranslate",((e,s,a)=>{t.controller.control&&t.controller.setTranslate(s,a)})),a("setTransition",((e,s,a)=>{t.controller.control&&t.controller.setTransition(s,a)})),Object.assign(t.controller,{setTranslate:function(e,s){const a=t.controller.control;let r,n;const l=t.constructor;function o(e){const s=t.rtlTranslate?-t.translate:t.translate;"slide"===t.params.controller.by&&(!function(e){t.controller.spline||(t.controller.spline=t.params.loop?new i(t.slidesGrid,e.slidesGrid):new i(t.snapGrid,e.snapGrid))}(e),n=-t.controller.spline.interpolate(-s)),n&&"container"!==t.params.controller.by||(r=(e.maxTranslate()-e.minTranslate())/(t.maxTranslate()-t.minTranslate()),n=(s-t.minTranslate())*r+e.minTranslate()),t.params.controller.inverse&&(n=e.maxTranslate()-n),e.updateProgress(n),e.setTranslate(n,t),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(a))for(let e=0;e{s.updateAutoHeight()})),s.$wrapperEl.transitionEnd((()=>{i&&(s.params.loop&&"slide"===t.params.controller.by&&s.loopFix(),s.transitionEnd())})))}if(Array.isArray(i))for(r=0;r{n(e),"BUTTON"!==e[0].tagName&&(o(e,"button"),e.on("keydown",m)),p(e,s),function(e,t){e.attr("aria-controls",t)}(e,t)},w=()=>{t.a11y.clicked=!0},b=()=>{requestAnimationFrame((()=>{requestAnimationFrame((()=>{t.destroyed||(t.a11y.clicked=!1)}))}))},x=e=>{if(t.a11y.clicked)return;const s=e.target.closest(`.${t.params.slideClass}`);if(!s||!t.slides.includes(s))return;const a=t.slides.indexOf(s)===t.activeIndex,i=t.params.watchSlidesProgress&&t.visibleSlides&&t.visibleSlides.includes(s);a||i||e.sourceCapabilities&&e.sourceCapabilities.firesTouchEvents||(t.isHorizontal()?t.el.scrollLeft=0:t.el.scrollTop=0,t.slideTo(t.slides.indexOf(s),0))},y=()=>{const e=t.params.a11y;e.itemRoleDescriptionMessage&&c(d(t.slides),e.itemRoleDescriptionMessage),e.slideRole&&o(d(t.slides),e.slideRole);const s=t.params.loop?t.slides.filter((e=>!e.classList.contains(t.params.slideDuplicateClass))).length:t.slides.length;e.slideLabelMessage&&t.slides.each(((a,i)=>{const r=d(a),n=t.params.loop?parseInt(r.attr("data-swiper-slide-index"),10):i;p(r,e.slideLabelMessage.replace(/\{\{index\}\}/,n+1).replace(/\{\{slidesLength\}\}/,s))}))},E=()=>{const e=t.params.a11y;t.$el.append(i);const s=t.$el;e.containerRoleDescriptionMessage&&c(s,e.containerRoleDescriptionMessage),e.containerMessage&&p(s,e.containerMessage);const a=t.$wrapperEl,r=e.id||a.attr("id")||`swiper-wrapper-${n=16,void 0===n&&(n=16),"x".repeat(n).replace(/x/g,(()=>Math.round(16*Math.random()).toString(16)))}`;var n;const l=t.params.autoplay&&t.params.autoplay.enabled?"off":"polite";var o;let d,u;o=r,a.attr("id",o),function(e,t){e.attr("aria-live",t)}(a,l),y(),t.navigation&&t.navigation.$nextEl&&(d=t.navigation.$nextEl),t.navigation&&t.navigation.$prevEl&&(u=t.navigation.$prevEl),d&&d.length&&v(d,r,e.nextSlideMessage),u&&u.length&&v(u,r,e.prevSlideMessage),g()&&t.pagination.$el.on("keydown",U(t.params.pagination.bulletClass),m),t.$el.on("focus",x,!0),t.$el.on("pointerdown",w,!0),t.$el.on("pointerup",b,!0)};a("beforeInit",(()=>{i=d(``)})),a("afterInit",(()=>{t.params.a11y.enabled&&E()})),a("slidesLengthChange snapGridLengthChange slidesGridLengthChange",(()=>{t.params.a11y.enabled&&y()})),a("fromEdge toEdge afterInit lock unlock",(()=>{t.params.a11y.enabled&&function(){if(t.params.loop||t.params.rewind||!t.navigation)return;const{$nextEl:e,$prevEl:s}=t.navigation;s&&s.length>0&&(t.isBeginning?(u(s),l(s)):(h(s),n(s))),e&&e.length>0&&(t.isEnd?(u(e),l(e)):(h(e),n(e)))}()})),a("paginationUpdate",(()=>{t.params.a11y.enabled&&function(){const e=t.params.a11y;f()&&t.pagination.bullets.each((s=>{const a=d(s);t.params.pagination.clickable&&(n(a),t.params.pagination.renderBullet||(o(a,"button"),p(a,e.paginationBulletMessage.replace(/\{\{index\}\}/,a.index()+1)))),a.is(`.${t.params.pagination.bulletActiveClass}`)?a.attr("aria-current","true"):a.removeAttr("aria-current")}))}()})),a("destroy",(()=>{t.params.a11y.enabled&&function(){let e,s;i&&i.length>0&&i.remove(),t.navigation&&t.navigation.$nextEl&&(e=t.navigation.$nextEl),t.navigation&&t.navigation.$prevEl&&(s=t.navigation.$prevEl),e&&e.off("keydown",m),s&&s.off("keydown",m),g()&&t.pagination.$el.off("keydown",U(t.params.pagination.bulletClass),m),t.$el.off("focus",x,!0),t.$el.off("pointerdown",w,!0),t.$el.off("pointerup",b,!0)}()}))},function(e){let{swiper:t,extendParams:s,on:a}=e;s({history:{enabled:!1,root:"",replaceState:!1,key:"slides",keepQuery:!1}});let i=!1,n={};const l=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),o=e=>{const t=r();let s;s=e?new URL(e):t.location;const a=s.pathname.slice(1).split("/").filter((e=>""!==e)),i=a.length;return{key:a[i-2],value:a[i-1]}},d=(e,s)=>{const a=r();if(!i||!t.params.history.enabled)return;let n;n=t.params.url?new URL(t.params.url):a.location;const o=t.slides.eq(s);let d=l(o.attr("data-history"));if(t.params.history.root.length>0){let s=t.params.history.root;"/"===s[s.length-1]&&(s=s.slice(0,s.length-1)),d=`${s}/${e}/${d}`}else n.pathname.includes(e)||(d=`${e}/${d}`);t.params.history.keepQuery&&(d+=n.search);const c=a.history.state;c&&c.value===d||(t.params.history.replaceState?a.history.replaceState({value:d},null,d):a.history.pushState({value:d},null,d))},c=(e,s,a)=>{if(s)for(let i=0,r=t.slides.length;i{n=o(t.params.url),c(t.params.speed,n.value,!1)};a("init",(()=>{t.params.history.enabled&&(()=>{const e=r();if(t.params.history){if(!e.history||!e.history.pushState)return t.params.history.enabled=!1,void(t.params.hashNavigation.enabled=!0);i=!0,n=o(t.params.url),(n.key||n.value)&&(c(0,n.value,t.params.runCallbacksOnInit),t.params.history.replaceState||e.addEventListener("popstate",p))}})()})),a("destroy",(()=>{t.params.history.enabled&&(()=>{const e=r();t.params.history.replaceState||e.removeEventListener("popstate",p)})()})),a("transitionEnd _freeModeNoMomentumRelease",(()=>{i&&d(t.params.history.key,t.activeIndex)})),a("slideChange",(()=>{i&&t.params.cssMode&&d(t.params.history.key,t.activeIndex)}))},function(e){let{swiper:t,extendParams:s,emit:i,on:n}=e,l=!1;const o=a(),c=r();s({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}});const p=()=>{i("hashChange");const e=o.location.hash.replace("#","");if(e!==t.slides.eq(t.activeIndex).attr("data-hash")){const s=t.$wrapperEl.children(`.${t.params.slideClass}[data-hash="${e}"]`).index();if(void 0===s)return;t.slideTo(s)}},u=()=>{if(l&&t.params.hashNavigation.enabled)if(t.params.hashNavigation.replaceState&&c.history&&c.history.replaceState)c.history.replaceState(null,null,`#${t.slides.eq(t.activeIndex).attr("data-hash")}`||""),i("hashSet");else{const e=t.slides.eq(t.activeIndex),s=e.attr("data-hash")||e.attr("data-history");o.location.hash=s||"",i("hashSet")}};n("init",(()=>{t.params.hashNavigation.enabled&&(()=>{if(!t.params.hashNavigation.enabled||t.params.history&&t.params.history.enabled)return;l=!0;const e=o.location.hash.replace("#","");if(e){const s=0;for(let a=0,i=t.slides.length;a{t.params.hashNavigation.enabled&&t.params.hashNavigation.watchState&&d(c).off("hashchange",p)})),n("transitionEnd _freeModeNoMomentumRelease",(()=>{l&&u()})),n("slideChange",(()=>{l&&t.params.cssMode&&u()}))},function(e){let t,{swiper:s,extendParams:i,on:r,emit:n}=e;function l(){if(!s.size)return s.autoplay.running=!1,void(s.autoplay.paused=!1);const e=s.slides.eq(s.activeIndex);let a=s.params.autoplay.delay;e.attr("data-swiper-autoplay")&&(a=e.attr("data-swiper-autoplay")||s.params.autoplay.delay),clearTimeout(t),t=p((()=>{let e;s.params.autoplay.reverseDirection?s.params.loop?(s.loopFix(),e=s.slidePrev(s.params.speed,!0,!0),n("autoplay")):s.isBeginning?s.params.autoplay.stopOnLastSlide?d():(e=s.slideTo(s.slides.length-1,s.params.speed,!0,!0),n("autoplay")):(e=s.slidePrev(s.params.speed,!0,!0),n("autoplay")):s.params.loop?(s.loopFix(),e=s.slideNext(s.params.speed,!0,!0),n("autoplay")):s.isEnd?s.params.autoplay.stopOnLastSlide?d():(e=s.slideTo(0,s.params.speed,!0,!0),n("autoplay")):(e=s.slideNext(s.params.speed,!0,!0),n("autoplay")),(s.params.cssMode&&s.autoplay.running||!1===e)&&l()}),a)}function o(){return void 0===t&&(!s.autoplay.running&&(s.autoplay.running=!0,n("autoplayStart"),l(),!0))}function d(){return!!s.autoplay.running&&(void 0!==t&&(t&&(clearTimeout(t),t=void 0),s.autoplay.running=!1,n("autoplayStop"),!0))}function c(e){s.autoplay.running&&(s.autoplay.paused||(t&&clearTimeout(t),s.autoplay.paused=!0,0!==e&&s.params.autoplay.waitForTransition?["transitionend","webkitTransitionEnd"].forEach((e=>{s.$wrapperEl[0].addEventListener(e,h)})):(s.autoplay.paused=!1,l())))}function u(){const e=a();"hidden"===e.visibilityState&&s.autoplay.running&&c(),"visible"===e.visibilityState&&s.autoplay.paused&&(l(),s.autoplay.paused=!1)}function h(e){s&&!s.destroyed&&s.$wrapperEl&&e.target===s.$wrapperEl[0]&&(["transitionend","webkitTransitionEnd"].forEach((e=>{s.$wrapperEl[0].removeEventListener(e,h)})),s.autoplay.paused=!1,s.autoplay.running?l():d())}function m(){s.params.autoplay.disableOnInteraction?d():(n("autoplayPause"),c()),["transitionend","webkitTransitionEnd"].forEach((e=>{s.$wrapperEl[0].removeEventListener(e,h)}))}function f(){s.params.autoplay.disableOnInteraction||(s.autoplay.paused=!1,n("autoplayResume"),l())}s.autoplay={running:!1,paused:!1},i({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}}),r("init",(()=>{if(s.params.autoplay.enabled){o();a().addEventListener("visibilitychange",u),s.params.autoplay.pauseOnMouseEnter&&(s.$el.on("mouseenter",m),s.$el.on("mouseleave",f))}})),r("beforeTransitionStart",((e,t,a)=>{s.autoplay.running&&(a||!s.params.autoplay.disableOnInteraction?s.autoplay.pause(t):d())})),r("sliderFirstMove",(()=>{s.autoplay.running&&(s.params.autoplay.disableOnInteraction?d():c())})),r("touchEnd",(()=>{s.params.cssMode&&s.autoplay.paused&&!s.params.autoplay.disableOnInteraction&&l()})),r("destroy",(()=>{s.$el.off("mouseenter",m),s.$el.off("mouseleave",f),s.autoplay.running&&d();a().removeEventListener("visibilitychange",u)})),Object.assign(s.autoplay,{pause:c,run:l,start:o,stop:d})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let i=!1,r=!1;function n(){const e=t.thumbs.swiper;if(!e||e.destroyed)return;const s=e.clickedIndex,a=e.clickedSlide;if(a&&d(a).hasClass(t.params.thumbs.slideThumbActiveClass))return;if(null==s)return;let i;if(i=e.params.loop?parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"),10):s,t.params.loop){let e=t.activeIndex;t.slides.eq(e).hasClass(t.params.slideDuplicateClass)&&(t.loopFix(),t._clientLeft=t.$wrapperEl[0].clientLeft,e=t.activeIndex);const s=t.slides.eq(e).prevAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(),a=t.slides.eq(e).nextAll(`[data-swiper-slide-index="${i}"]`).eq(0).index();i=void 0===s?a:void 0===a?s:a-e1&&!t.params.centeredSlides&&(i=t.params.slidesPerView),t.params.thumbs.multipleActiveThumbs||(i=1),i=Math.floor(i),s.slides.removeClass(r),s.params.loop||s.params.virtual&&s.params.virtual.enabled)for(let e=0;e1?a:o:a-ot.previousIndex?"next":"prev"}else i=t.realIndex,r=i>t.previousIndex?"next":"prev";l&&(i+="next"===r?n:-1*n),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(i)<0&&(s.params.centeredSlides?i=i>o?i-Math.floor(a/2)+1:i+Math.floor(a/2)-1:i>o&&s.params.slidesPerGroup,s.slideTo(i,e?0:void 0))}}t.thumbs={swiper:null},a("beforeInit",(()=>{const{thumbs:e}=t.params;e&&e.swiper&&(l(),o(!0))})),a("slideChange update resize observerUpdate",(()=>{o()})),a("setTransition",((e,s)=>{const a=t.thumbs.swiper;a&&!a.destroyed&&a.setTransition(s)})),a("beforeDestroy",(()=>{const e=t.thumbs.swiper;e&&!e.destroyed&&r&&e.destroy()})),Object.assign(t.thumbs,{init:l,update:o})},function(e){let{swiper:t,extendParams:s,emit:a,once:i}=e;s({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),Object.assign(t,{freeMode:{onTouchStart:function(){const e=t.getTranslate();t.setTranslate(e),t.setTransition(0),t.touchEventsData.velocities.length=0,t.freeMode.onTouchEnd({currentPos:t.rtl?t.translate:-t.translate})},onTouchMove:function(){const{touchEventsData:e,touches:s}=t;0===e.velocities.length&&e.velocities.push({position:s[t.isHorizontal()?"startX":"startY"],time:e.touchStartTime}),e.velocities.push({position:s[t.isHorizontal()?"currentX":"currentY"],time:u()})},onTouchEnd:function(e){let{currentPos:s}=e;const{params:r,$wrapperEl:n,rtlTranslate:l,snapGrid:o,touchEventsData:d}=t,c=u()-d.touchStartTime;if(s<-t.minTranslate())t.slideTo(t.activeIndex);else if(s>-t.maxTranslate())t.slides.length1){const e=d.velocities.pop(),s=d.velocities.pop(),a=e.position-s.position,i=e.time-s.time;t.velocity=a/i,t.velocity/=2,Math.abs(t.velocity)150||u()-e.time>300)&&(t.velocity=0)}else t.velocity=0;t.velocity*=r.freeMode.momentumVelocityRatio,d.velocities.length=0;let e=1e3*r.freeMode.momentumRatio;const s=t.velocity*e;let c=t.translate+s;l&&(c=-c);let p,h=!1;const m=20*Math.abs(t.velocity)*r.freeMode.momentumBounceRatio;let f;if(ct.minTranslate())r.freeMode.momentumBounce?(c-t.minTranslate()>m&&(c=t.minTranslate()+m),p=t.minTranslate(),h=!0,d.allowMomentumBounce=!0):c=t.minTranslate(),r.loop&&r.centeredSlides&&(f=!0);else if(r.freeMode.sticky){let e;for(let t=0;t-c){e=t;break}c=Math.abs(o[e]-c){t.loopFix()})),0!==t.velocity){if(e=l?Math.abs((-c-t.translate)/t.velocity):Math.abs((c-t.translate)/t.velocity),r.freeMode.sticky){const s=Math.abs((l?-c:c)-t.translate),a=t.slidesSizesGrid[t.activeIndex];e=s{t&&!t.destroyed&&d.allowMomentumBounce&&(a("momentumBounce"),t.setTransition(r.speed),setTimeout((()=>{t.setTranslate(p),n.transitionEnd((()=>{t&&!t.destroyed&&t.transitionEnd()}))}),0))}))):t.velocity?(a("_freeModeNoMomentumRelease"),t.updateProgress(c),t.setTransition(e),t.setTranslate(c),t.transitionStart(!0,t.swipeDirection),t.animating||(t.animating=!0,n.transitionEnd((()=>{t&&!t.destroyed&&t.transitionEnd()})))):t.updateProgress(c),t.updateActiveIndex(),t.updateSlidesClasses()}else{if(r.freeMode.sticky)return void t.slideToClosest();r.freeMode&&a("_freeModeNoMomentumRelease")}(!r.freeMode.momentum||c>=r.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}}}})},function(e){let t,s,a,{swiper:i,extendParams:r}=e;r({grid:{rows:1,fill:"column"}}),i.grid={initSlides:e=>{const{slidesPerView:r}=i.params,{rows:n,fill:l}=i.params.grid;s=t/n,a=Math.floor(e/n),t=Math.floor(e/n)===e/n?e:Math.ceil(e/n)*n,"auto"!==r&&"row"===l&&(t=Math.max(t,r*n))},updateSlide:(e,r,n,l)=>{const{slidesPerGroup:o,spaceBetween:d}=i.params,{rows:c,fill:p}=i.params.grid;let u,h,m;if("row"===p&&o>1){const s=Math.floor(e/(o*c)),a=e-c*o*s,i=0===s?o:Math.min(Math.ceil((n-s*c*o)/c),o);m=Math.floor(a/i),h=a-m*i+s*o,u=h+m*t/c,r.css({"-webkit-order":u,order:u})}else"column"===p?(h=Math.floor(e/c),m=e-h*c,(h>a||h===a&&m===c-1)&&(m+=1,m>=c&&(m=0,h+=1))):(m=Math.floor(e/s),h=e-m*s);r.css(l("margin-top"),0!==m?d&&`${d}px`:"")},updateWrapperSize:(e,s,a)=>{const{spaceBetween:r,centeredSlides:n,roundLengths:l}=i.params,{rows:o}=i.params.grid;if(i.virtualSize=(e+r)*t,i.virtualSize=Math.ceil(i.virtualSize/o)-r,i.$wrapperEl.css({[a("width")]:`${i.virtualSize+r}px`}),n){s.splice(0,s.length);const e=[];for(let t=0;t{const{slides:e}=t,s=t.params.fadeEffect;for(let a=0;a{const{transformEl:s}=t.params.fadeEffect;(s?t.slides.find(s):t.slides).transition(e),ae({swiper:t,duration:e,transformEl:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}});const i=(e,t,s)=>{let a=s?e.find(".swiper-slide-shadow-left"):e.find(".swiper-slide-shadow-top"),i=s?e.find(".swiper-slide-shadow-right"):e.find(".swiper-slide-shadow-bottom");0===a.length&&(a=d(`
`),e.append(a)),0===i.length&&(i=d(`
`),e.append(i)),a.length&&(a[0].style.opacity=Math.max(-t,0)),i.length&&(i[0].style.opacity=Math.max(t,0))};te({effect:"cube",swiper:t,on:a,setTranslate:()=>{const{$el:e,$wrapperEl:s,slides:a,width:r,height:n,rtlTranslate:l,size:o,browser:c}=t,p=t.params.cubeEffect,u=t.isHorizontal(),h=t.virtual&&t.params.virtual.enabled;let m,f=0;p.shadow&&(u?(m=s.find(".swiper-cube-shadow"),0===m.length&&(m=d('
'),s.append(m)),m.css({height:`${r}px`})):(m=e.find(".swiper-cube-shadow"),0===m.length&&(m=d('
'),e.append(m))));for(let e=0;e-1&&(f=90*s+90*d,l&&(f=90*-s-90*d)),t.transform(v),p.slideShadows&&i(t,d,u)}if(s.css({"-webkit-transform-origin":`50% 50% -${o/2}px`,"transform-origin":`50% 50% -${o/2}px`}),p.shadow)if(u)m.transform(`translate3d(0px, ${r/2+p.shadowOffset}px, ${-r/2}px) rotateX(90deg) rotateZ(0deg) scale(${p.shadowScale})`);else{const e=Math.abs(f)-90*Math.floor(Math.abs(f)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=p.shadowScale,a=p.shadowScale/t,i=p.shadowOffset;m.transform(`scale3d(${s}, 1, ${a}) translate3d(0px, ${n/2+i}px, ${-n/2/a}px) rotateX(-90deg)`)}const g=c.isSafari||c.isWebView?-o/2:0;s.transform(`translate3d(0px,0,${g}px) rotateX(${t.isHorizontal()?0:f}deg) rotateY(${t.isHorizontal()?-f:0}deg)`),s[0].style.setProperty("--swiper-cube-translate-z",`${g}px`)},setTransition:e=>{const{$el:s,slides:a}=t;a.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.cubeEffect.shadow&&!t.isHorizontal()&&s.find(".swiper-cube-shadow").transition(e)},recreateShadows:()=>{const e=t.isHorizontal();t.slides.each((t=>{const s=Math.max(Math.min(t.progress,1),-1);i(d(t),s,e)}))},getEffectParams:()=>t.params.cubeEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({flipEffect:{slideShadows:!0,limitRotation:!0,transformEl:null}});const i=(e,s,a)=>{let i=t.isHorizontal()?e.find(".swiper-slide-shadow-left"):e.find(".swiper-slide-shadow-top"),r=t.isHorizontal()?e.find(".swiper-slide-shadow-right"):e.find(".swiper-slide-shadow-bottom");0===i.length&&(i=ie(a,e,t.isHorizontal()?"left":"top")),0===r.length&&(r=ie(a,e,t.isHorizontal()?"right":"bottom")),i.length&&(i[0].style.opacity=Math.max(-s,0)),r.length&&(r[0].style.opacity=Math.max(s,0))};te({effect:"flip",swiper:t,on:a,setTranslate:()=>{const{slides:e,rtlTranslate:s}=t,a=t.params.flipEffect;for(let r=0;r{const{transformEl:s}=t.params.flipEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),ae({swiper:t,duration:e,transformEl:s})},recreateShadows:()=>{const e=t.params.flipEffect;t.slides.each((s=>{const a=d(s);let r=a[0].progress;t.params.flipEffect.limitRotation&&(r=Math.max(Math.min(s.progress,1),-1)),i(a,r,e)}))},getEffectParams:()=>t.params.flipEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0,transformEl:null}}),te({effect:"coverflow",swiper:t,on:a,setTranslate:()=>{const{width:e,height:s,slides:a,slidesSizesGrid:i}=t,r=t.params.coverflowEffect,n=t.isHorizontal(),l=t.translate,o=n?e/2-l:s/2-l,d=n?r.rotate:-r.rotate,c=r.depth;for(let e=0,t=a.length;e0?p:0),s.length&&(s[0].style.opacity=-p>0?-p:0)}}},setTransition:e=>{const{transformEl:s}=t.params.coverflowEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({creativeEffect:{transformEl:null,limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const i=e=>"string"==typeof e?e:`${e}px`;te({effect:"creative",swiper:t,on:a,setTranslate:()=>{const{slides:e,$wrapperEl:s,slidesSizesGrid:a}=t,r=t.params.creativeEffect,{progressMultiplier:n}=r,l=t.params.centeredSlides;if(l){const e=a[0]/2-t.params.slidesOffsetBefore||0;s.transform(`translateX(calc(50% - ${e}px))`)}for(let s=0;s0&&(f=r.prev,m=!0),u.forEach(((e,t)=>{u[t]=`calc(${e}px + (${i(f.translate[t])} * ${Math.abs(d*n)}))`})),h.forEach(((e,t)=>{h[t]=f.rotate[t]*Math.abs(d*n)})),a[0].style.zIndex=-Math.abs(Math.round(o))+e.length;const g=u.join(", "),v=`rotateX(${h[0]}deg) rotateY(${h[1]}deg) rotateZ(${h[2]}deg)`,w=c<0?`scale(${1+(1-f.scale)*c*n})`:`scale(${1-(1-f.scale)*c*n})`,b=c<0?1+(1-f.opacity)*c*n:1-(1-f.opacity)*c*n,x=`translate3d(${g}) ${v} ${w}`;if(m&&f.shadow||!m){let e=a.children(".swiper-slide-shadow");if(0===e.length&&f.shadow&&(e=ie(r,a)),e.length){const t=r.shadowPerProgress?d*(1/r.limitProgress):d;e[0].style.opacity=Math.min(Math.max(Math.abs(t),0),1)}}const y=se(r,a);y.transform(x).css({opacity:b}),f.origin&&y.css("transform-origin",f.origin)}},setTransition:e=>{const{transformEl:s}=t.params.creativeEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow").transition(e),ae({swiper:t,duration:e,transformEl:s,allSlides:!0})},perspective:()=>t.params.creativeEffect.perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({cardsEffect:{slideShadows:!0,transformEl:null,rotate:!0,perSlideRotate:2,perSlideOffset:8}}),te({effect:"cards",swiper:t,on:a,setTranslate:()=>{const{slides:e,activeIndex:s}=t,a=t.params.cardsEffect,{startTranslate:i,isTouched:r}=t.touchEventsData,n=t.translate;for(let l=0;l0&&c<1&&(r||t.params.cssMode)&&n-1&&(r||t.params.cssMode)&&n>i;if(b||x){const e=(1-Math.abs((Math.abs(c)-.5)/.5))**.5;g+=-28*c*e,f+=-.5*e,v+=96*e,h=-25*e*Math.abs(c)+"%"}if(u=c<0?`calc(${u}px + (${v*Math.abs(c)}%))`:c>0?`calc(${u}px + (-${v*Math.abs(c)}%))`:`${u}px`,!t.isHorizontal()){const e=h;h=u,u=e}const y=c<0?""+(1+(1-f)*c):""+(1-(1-f)*c),E=`\n translate3d(${u}, ${h}, ${m}px)\n rotateZ(${a.rotate?g:0}deg)\n scale(${y})\n `;if(a.slideShadows){let e=o.find(".swiper-slide-shadow");0===e.length&&(e=ie(a,o)),e.length&&(e[0].style.opacity=Math.min(Math.max((Math.abs(c)-.5)/.5,0),1))}o[0].style.zIndex=-Math.abs(Math.round(d))+e.length;se(a,o).transform(E)}},setTransition:e=>{const{transformEl:s}=t.params.cardsEffect;(s?t.slides.find(s):t.slides).transition(e).find(".swiper-slide-shadow").transition(e),ae({swiper:t,duration:e,transformEl:s})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!t.params.cssMode})})}];return V.use(re),V})); +//# sourceMappingURL=swiper-bundle.min.js.map \ No newline at end of file diff --git a/public/js/swiper.min.js b/public/js/swiper.min.js new file mode 100644 index 0000000..e6cfb82 --- /dev/null +++ b/public/js/swiper.min.js @@ -0,0 +1,14 @@ +/** + * Swiper 5.3.6 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * http://swiperjs.com + * + * Copyright 2014-2020 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: February 29, 2020 + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Swiper=t()}(this,(function(){"use strict";var e="undefined"==typeof document?{body:{},addEventListener:function(){},removeEventListener:function(){},activeElement:{blur:function(){},nodeName:""},querySelector:function(){return null},querySelectorAll:function(){return[]},getElementById:function(){return null},createEvent:function(){return{initEvent:function(){}}},createElement:function(){return{children:[],childNodes:[],style:{},setAttribute:function(){},getElementsByTagName:function(){return[]}}},location:{hash:""}}:document,t="undefined"==typeof window?{document:e,navigator:{userAgent:""},location:{},history:{},CustomEvent:function(){return this},addEventListener:function(){},removeEventListener:function(){},getComputedStyle:function(){return{getPropertyValue:function(){return""}}},Image:function(){},Date:function(){},screen:{},setTimeout:function(){},clearTimeout:function(){}}:window,i=function(e){for(var t=0;t=0&&d.indexOf(">")>=0){var h="div";for(0===d.indexOf(":~]/)?(a||e).querySelectorAll(s.trim()):[e.getElementById(s.trim().split("#")[1])],n=0;n0&&s[0].nodeType)for(n=0;n=0;u-=1){var v=c[u];r&&v.listener===r?(p.removeEventListener(d,v.proxyListener,n),c.splice(u,1)):r&&v.listener&&v.listener.dom7proxy&&v.listener.dom7proxy===r?(p.removeEventListener(d,v.proxyListener,n),c.splice(u,1)):r||(p.removeEventListener(d,v.proxyListener,n),c.splice(u,1))}}return this},trigger:function(){for(var i=[],s=arguments.length;s--;)i[s]=arguments[s];for(var a=i[0].split(" "),r=i[1],n=0;n0})),d.dispatchEvent(h),d.dom7EventData=[],delete d.dom7EventData}return this},transitionEnd:function(e){var t,i=["webkitTransitionEnd","transitionend"],s=this;function a(r){if(r.target===this)for(e.call(this,r),t=0;t0){if(e){var t=this.styles();return this[0].offsetWidth+parseFloat(t.getPropertyValue("margin-right"))+parseFloat(t.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){var t=this.styles();return this[0].offsetHeight+parseFloat(t.getPropertyValue("margin-top"))+parseFloat(t.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},offset:function(){if(this.length>0){var i=this[0],s=i.getBoundingClientRect(),a=e.body,r=i.clientTop||a.clientTop||0,n=i.clientLeft||a.clientLeft||0,o=i===t?t.scrollY:i.scrollTop,l=i===t?t.scrollX:i.scrollLeft;return{top:s.top+o-r,left:s.left+l-n}}return null},css:function(e,i){var s;if(1===arguments.length){if("string"!=typeof e){for(s=0;ss-1?[]:e<0?(t=s+e)<0?[]:[this[t]]:[this[e]])},append:function(){for(var t,s=[],a=arguments.length;a--;)s[a]=arguments[a];for(var r=0;r=0;a-=1)this[s].insertBefore(r.childNodes[a],this[s].childNodes[0])}else if(t instanceof i)for(a=0;a0?e?this[0].nextElementSibling&&s(this[0].nextElementSibling).is(e)?new i([this[0].nextElementSibling]):new i([]):this[0].nextElementSibling?new i([this[0].nextElementSibling]):new i([]):new i([])},nextAll:function(e){var t=[],a=this[0];if(!a)return new i([]);for(;a.nextElementSibling;){var r=a.nextElementSibling;e?s(r).is(e)&&t.push(r):t.push(r),a=r}return new i(t)},prev:function(e){if(this.length>0){var t=this[0];return e?t.previousElementSibling&&s(t.previousElementSibling).is(e)?new i([t.previousElementSibling]):new i([]):t.previousElementSibling?new i([t.previousElementSibling]):new i([])}return new i([])},prevAll:function(e){var t=[],a=this[0];if(!a)return new i([]);for(;a.previousElementSibling;){var r=a.previousElementSibling;e?s(r).is(e)&&t.push(r):t.push(r),a=r}return new i(t)},parent:function(e){for(var t=[],i=0;i6&&(a=a.split(", ").map((function(e){return e.replace(",",".")})).join(", ")),r=new t.WebKitCSSMatrix("none"===a?"":a)):s=(r=n.MozTransform||n.OTransform||n.MsTransform||n.msTransform||n.transform||n.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,")).toString().split(","),"x"===i&&(a=t.WebKitCSSMatrix?r.m41:16===s.length?parseFloat(s[12]):parseFloat(s[4])),"y"===i&&(a=t.WebKitCSSMatrix?r.m42:16===s.length?parseFloat(s[13]):parseFloat(s[5])),a||0},parseUrlQuery:function(e){var i,s,a,r,n={},o=e||t.location.href;if("string"==typeof o&&o.length)for(r=(s=(o=o.indexOf("?")>-1?o.replace(/\S*\?/,""):"").split("&").filter((function(e){return""!==e}))).length,i=0;i0||"ontouchstart"in t||t.DocumentTouch&&e instanceof t.DocumentTouch),pointerEvents:!!t.PointerEvent&&"maxTouchPoints"in t.navigator&&t.navigator.maxTouchPoints>0,observer:"MutationObserver"in t||"WebkitMutationObserver"in t,passiveListener:function(){var e=!1;try{var i=Object.defineProperty({},"passive",{get:function(){e=!0}});t.addEventListener("testPassiveListener",null,i)}catch(e){}return e}(),gestures:"ongesturestart"in t},l=function(e){void 0===e&&(e={});var t=this;t.params=e,t.eventsListeners={},t.params&&t.params.on&&Object.keys(t.params.on).forEach((function(e){t.on(e,t.params.on[e])}))},d={components:{configurable:!0}};l.prototype.on=function(e,t,i){var s=this;if("function"!=typeof t)return s;var a=i?"unshift":"push";return e.split(" ").forEach((function(e){s.eventsListeners[e]||(s.eventsListeners[e]=[]),s.eventsListeners[e][a](t)})),s},l.prototype.once=function(e,t,i){var s=this;if("function"!=typeof t)return s;function a(){for(var i=[],r=arguments.length;r--;)i[r]=arguments[r];s.off(e,a),a.f7proxy&&delete a.f7proxy,t.apply(s,i)}return a.f7proxy=t,s.on(e,a,i)},l.prototype.off=function(e,t){var i=this;return i.eventsListeners?(e.split(" ").forEach((function(e){void 0===t?i.eventsListeners[e]=[]:i.eventsListeners[e]&&i.eventsListeners[e].length&&i.eventsListeners[e].forEach((function(s,a){(s===t||s.f7proxy&&s.f7proxy===t)&&i.eventsListeners[e].splice(a,1)}))})),i):i},l.prototype.emit=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var i,s,a,r=this;if(!r.eventsListeners)return r;"string"==typeof e[0]||Array.isArray(e[0])?(i=e[0],s=e.slice(1,e.length),a=r):(i=e[0].events,s=e[0].data,a=e[0].context||r);var n=Array.isArray(i)?i:i.split(" ");return n.forEach((function(e){if(r.eventsListeners&&r.eventsListeners[e]){var t=[];r.eventsListeners[e].forEach((function(e){t.push(e)})),t.forEach((function(e){e.apply(a,s)}))}})),r},l.prototype.useModulesParams=function(e){var t=this;t.modules&&Object.keys(t.modules).forEach((function(i){var s=t.modules[i];s.params&&n.extend(e,s.params)}))},l.prototype.useModules=function(e){void 0===e&&(e={});var t=this;t.modules&&Object.keys(t.modules).forEach((function(i){var s=t.modules[i],a=e[i]||{};s.instance&&Object.keys(s.instance).forEach((function(e){var i=s.instance[e];t[e]="function"==typeof i?i.bind(t):i})),s.on&&t.on&&Object.keys(s.on).forEach((function(e){t.on(e,s.on[e])})),s.create&&s.create.bind(t)(a)}))},d.components.set=function(e){this.use&&this.use(e)},l.installModule=function(e){for(var t=[],i=arguments.length-1;i-- >0;)t[i]=arguments[i+1];var s=this;s.prototype.modules||(s.prototype.modules={});var a=e.name||Object.keys(s.prototype.modules).length+"_"+n.now();return s.prototype.modules[a]=e,e.proto&&Object.keys(e.proto).forEach((function(t){s.prototype[t]=e.proto[t]})),e.static&&Object.keys(e.static).forEach((function(t){s[t]=e.static[t]})),e.install&&e.install.apply(s,t),s},l.use=function(e){for(var t=[],i=arguments.length-1;i-- >0;)t[i]=arguments[i+1];var s=this;return Array.isArray(e)?(e.forEach((function(e){return s.installModule(e)})),s):s.installModule.apply(s,[e].concat(t))},Object.defineProperties(l,d);var h={updateSize:function(){var e,t,i=this.$el;e=void 0!==this.params.width?this.params.width:i[0].clientWidth,t=void 0!==this.params.height?this.params.height:i[0].clientHeight,0===e&&this.isHorizontal()||0===t&&this.isVertical()||(e=e-parseInt(i.css("padding-left"),10)-parseInt(i.css("padding-right"),10),t=t-parseInt(i.css("padding-top"),10)-parseInt(i.css("padding-bottom"),10),n.extend(this,{width:e,height:t,size:this.isHorizontal()?e:t}))},updateSlides:function(){var e=this.params,i=this.$wrapperEl,s=this.size,a=this.rtlTranslate,r=this.wrongRTL,o=this.virtual&&e.virtual.enabled,l=o?this.virtual.slides.length:this.slides.length,d=i.children("."+this.params.slideClass),h=o?this.virtual.slides.length:d.length,p=[],c=[],u=[];function v(t){return!e.cssMode||t!==d.length-1}var f=e.slidesOffsetBefore;"function"==typeof f&&(f=e.slidesOffsetBefore.call(this));var m=e.slidesOffsetAfter;"function"==typeof m&&(m=e.slidesOffsetAfter.call(this));var g=this.snapGrid.length,b=this.snapGrid.length,w=e.spaceBetween,y=-f,x=0,T=0;if(void 0!==s){var E,S;"string"==typeof w&&w.indexOf("%")>=0&&(w=parseFloat(w.replace("%",""))/100*s),this.virtualSize=-w,a?d.css({marginLeft:"",marginTop:""}):d.css({marginRight:"",marginBottom:""}),e.slidesPerColumn>1&&(E=Math.floor(h/e.slidesPerColumn)===h/this.params.slidesPerColumn?h:Math.ceil(h/e.slidesPerColumn)*e.slidesPerColumn,"auto"!==e.slidesPerView&&"row"===e.slidesPerColumnFill&&(E=Math.max(E,e.slidesPerView*e.slidesPerColumn)));for(var C,M=e.slidesPerColumn,P=E/M,z=Math.floor(h/e.slidesPerColumn),k=0;k1){var L=void 0,I=void 0,D=void 0;if("row"===e.slidesPerColumnFill&&e.slidesPerGroup>1){var O=Math.floor(k/(e.slidesPerGroup*e.slidesPerColumn)),A=k-e.slidesPerColumn*e.slidesPerGroup*O,G=0===O?e.slidesPerGroup:Math.min(Math.ceil((h-O*M*e.slidesPerGroup)/M),e.slidesPerGroup);L=(I=A-(D=Math.floor(A/G))*G+O*e.slidesPerGroup)+D*E/M,$.css({"-webkit-box-ordinal-group":L,"-moz-box-ordinal-group":L,"-ms-flex-order":L,"-webkit-order":L,order:L})}else"column"===e.slidesPerColumnFill?(D=k-(I=Math.floor(k/M))*M,(I>z||I===z&&D===M-1)&&(D+=1)>=M&&(D=0,I+=1)):I=k-(D=Math.floor(k/P))*P;$.css("margin-"+(this.isHorizontal()?"top":"left"),0!==D&&e.spaceBetween&&e.spaceBetween+"px")}if("none"!==$.css("display")){if("auto"===e.slidesPerView){var H=t.getComputedStyle($[0],null),B=$[0].style.transform,N=$[0].style.webkitTransform;if(B&&($[0].style.transform="none"),N&&($[0].style.webkitTransform="none"),e.roundLengths)S=this.isHorizontal()?$.outerWidth(!0):$.outerHeight(!0);else if(this.isHorizontal()){var X=parseFloat(H.getPropertyValue("width")),V=parseFloat(H.getPropertyValue("padding-left")),Y=parseFloat(H.getPropertyValue("padding-right")),F=parseFloat(H.getPropertyValue("margin-left")),W=parseFloat(H.getPropertyValue("margin-right")),R=H.getPropertyValue("box-sizing");S=R&&"border-box"===R?X+F+W:X+V+Y+F+W}else{var q=parseFloat(H.getPropertyValue("height")),j=parseFloat(H.getPropertyValue("padding-top")),K=parseFloat(H.getPropertyValue("padding-bottom")),U=parseFloat(H.getPropertyValue("margin-top")),_=parseFloat(H.getPropertyValue("margin-bottom")),Z=H.getPropertyValue("box-sizing");S=Z&&"border-box"===Z?q+U+_:q+j+K+U+_}B&&($[0].style.transform=B),N&&($[0].style.webkitTransform=N),e.roundLengths&&(S=Math.floor(S))}else S=(s-(e.slidesPerView-1)*w)/e.slidesPerView,e.roundLengths&&(S=Math.floor(S)),d[k]&&(this.isHorizontal()?d[k].style.width=S+"px":d[k].style.height=S+"px");d[k]&&(d[k].swiperSlideSize=S),u.push(S),e.centeredSlides?(y=y+S/2+x/2+w,0===x&&0!==k&&(y=y-s/2-w),0===k&&(y=y-s/2-w),Math.abs(y)<.001&&(y=0),e.roundLengths&&(y=Math.floor(y)),T%e.slidesPerGroup==0&&p.push(y),c.push(y)):(e.roundLengths&&(y=Math.floor(y)),(T-Math.min(this.params.slidesPerGroupSkip,T))%this.params.slidesPerGroup==0&&p.push(y),c.push(y),y=y+S+w),this.virtualSize+=S+w,x=S,T+=1}}if(this.virtualSize=Math.max(this.virtualSize,s)+m,a&&r&&("slide"===e.effect||"coverflow"===e.effect)&&i.css({width:this.virtualSize+e.spaceBetween+"px"}),e.setWrapperSize&&(this.isHorizontal()?i.css({width:this.virtualSize+e.spaceBetween+"px"}):i.css({height:this.virtualSize+e.spaceBetween+"px"})),e.slidesPerColumn>1&&(this.virtualSize=(S+e.spaceBetween)*E,this.virtualSize=Math.ceil(this.virtualSize/e.slidesPerColumn)-e.spaceBetween,this.isHorizontal()?i.css({width:this.virtualSize+e.spaceBetween+"px"}):i.css({height:this.virtualSize+e.spaceBetween+"px"}),e.centeredSlides)){C=[];for(var Q=0;Q1&&p.push(this.virtualSize-s)}if(0===p.length&&(p=[0]),0!==e.spaceBetween&&(this.isHorizontal()?a?d.filter(v).css({marginLeft:w+"px"}):d.filter(v).css({marginRight:w+"px"}):d.filter(v).css({marginBottom:w+"px"})),e.centeredSlides&&e.centeredSlidesBounds){var ie=0;u.forEach((function(t){ie+=t+(e.spaceBetween?e.spaceBetween:0)}));var se=(ie-=e.spaceBetween)-s;p=p.map((function(e){return e<0?-f:e>se?se+m:e}))}if(e.centerInsufficientSlides){var ae=0;if(u.forEach((function(t){ae+=t+(e.spaceBetween?e.spaceBetween:0)})),(ae-=e.spaceBetween)1)if(this.params.centeredSlides)i.push.apply(i,this.visibleSlides);else for(t=0;tthis.slides.length)break;i.push(this.slides.eq(a)[0])}else i.push(this.slides.eq(this.activeIndex)[0]);for(t=0;ts?r:s}s&&this.$wrapperEl.css("height",s+"px")},updateSlidesOffset:function(){for(var e=this.slides,t=0;t=0&&d1&&h<=this.size||d<=0&&h>=this.size)&&(this.visibleSlides.push(o),this.visibleSlidesIndexes.push(n),i.eq(n).addClass(t.slideVisibleClass))}o.progress=a?-l:l}this.visibleSlides=s(this.visibleSlides)}},updateProgress:function(e){if(void 0===e){var t=this.rtlTranslate?-1:1;e=this&&this.translate&&this.translate*t||0}var i=this.params,s=this.maxTranslate()-this.minTranslate(),a=this.progress,r=this.isBeginning,o=this.isEnd,l=r,d=o;0===s?(a=0,r=!0,o=!0):(r=(a=(e-this.minTranslate())/s)<=0,o=a>=1),n.extend(this,{progress:a,isBeginning:r,isEnd:o}),(i.watchSlidesProgress||i.watchSlidesVisibility||i.centeredSlides&&i.autoHeight)&&this.updateSlidesProgress(e),r&&!l&&this.emit("reachBeginning toEdge"),o&&!d&&this.emit("reachEnd toEdge"),(l&&!r||d&&!o)&&this.emit("fromEdge"),this.emit("progress",a)},updateSlidesClasses:function(){var e,t=this.slides,i=this.params,s=this.$wrapperEl,a=this.activeIndex,r=this.realIndex,n=this.virtual&&i.virtual.enabled;t.removeClass(i.slideActiveClass+" "+i.slideNextClass+" "+i.slidePrevClass+" "+i.slideDuplicateActiveClass+" "+i.slideDuplicateNextClass+" "+i.slideDuplicatePrevClass),(e=n?this.$wrapperEl.find("."+i.slideClass+'[data-swiper-slide-index="'+a+'"]'):t.eq(a)).addClass(i.slideActiveClass),i.loop&&(e.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+r+'"]').addClass(i.slideDuplicateActiveClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+r+'"]').addClass(i.slideDuplicateActiveClass));var o=e.nextAll("."+i.slideClass).eq(0).addClass(i.slideNextClass);i.loop&&0===o.length&&(o=t.eq(0)).addClass(i.slideNextClass);var l=e.prevAll("."+i.slideClass).eq(0).addClass(i.slidePrevClass);i.loop&&0===l.length&&(l=t.eq(-1)).addClass(i.slidePrevClass),i.loop&&(o.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass),l.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+l.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+l.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass))},updateActiveIndex:function(e){var t,i=this.rtlTranslate?this.translate:-this.translate,s=this.slidesGrid,a=this.snapGrid,r=this.params,o=this.activeIndex,l=this.realIndex,d=this.snapIndex,h=e;if(void 0===h){for(var p=0;p=s[p]&&i=s[p]&&i=s[p]&&(h=p);r.normalizeSlideIndex&&(h<0||void 0===h)&&(h=0)}if(a.indexOf(i)>=0)t=a.indexOf(i);else{var c=Math.min(r.slidesPerGroupSkip,h);t=c+Math.floor((h-c)/r.slidesPerGroup)}if(t>=a.length&&(t=a.length-1),h!==o){var u=parseInt(this.slides.eq(h).attr("data-swiper-slide-index")||h,10);n.extend(this,{snapIndex:t,realIndex:u,previousIndex:o,activeIndex:h}),this.emit("activeIndexChange"),this.emit("snapIndexChange"),l!==u&&this.emit("realIndexChange"),(this.initialized||this.runCallbacksOnInit)&&this.emit("slideChange")}else t!==d&&(this.snapIndex=t,this.emit("snapIndexChange"))},updateClickedSlide:function(e){var t=this.params,i=s(e.target).closest("."+t.slideClass)[0],a=!1;if(i)for(var r=0;rh?h:s&&ea?"next":is?"next":i=l.length&&(f=l.length-1),(p||o.initialSlide||0)===(h||0)&&i&&r.emit("beforeSlideChangeStart");var m,g=-l[f];if(r.updateProgress(g),o.normalizeSlideIndex)for(var b=0;b=Math.floor(100*d[b])&&(n=b);if(r.initialized&&n!==p){if(!r.allowSlideNext&&gr.translate&&g>r.maxTranslate()&&(p||0)!==n)return!1}if(m=n>p?"next":n=e&&(c=e)})),void 0!==c&&(d=n.indexOf(c))<0&&(d=this.activeIndex-1),this.slideTo(d,e,t,i)},slideReset:function(e,t,i){return void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),this.slideTo(this.activeIndex,e,t,i)},slideToClosest:function(e,t,i,s){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),void 0===s&&(s=.5);var a=this.activeIndex,r=Math.min(this.params.slidesPerGroupSkip,a),n=r+Math.floor((a-r)/this.params.slidesPerGroup),o=this.rtlTranslate?this.translate:-this.translate;if(o>=this.snapGrid[n]){var l=this.snapGrid[n];o-l>(this.snapGrid[n+1]-l)*s&&(a+=this.params.slidesPerGroup)}else{var d=this.snapGrid[n-1];o-d<=(this.snapGrid[n]-d)*s&&(a-=this.params.slidesPerGroup)}return a=Math.max(a,0),a=Math.min(a,this.slidesGrid.length-1),this.slideTo(a,e,t,i)},slideToClickedSlide:function(){var e,t=this,i=t.params,a=t.$wrapperEl,r="auto"===i.slidesPerView?t.slidesPerViewDynamic():i.slidesPerView,o=t.clickedIndex;if(i.loop){if(t.animating)return;e=parseInt(s(t.clickedSlide).attr("data-swiper-slide-index"),10),i.centeredSlides?ot.slides.length-t.loopedSlides+r/2?(t.loopFix(),o=a.children("."+i.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+i.slideDuplicateClass+")").eq(0).index(),n.nextTick((function(){t.slideTo(o)}))):t.slideTo(o):o>t.slides.length-r?(t.loopFix(),o=a.children("."+i.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+i.slideDuplicateClass+")").eq(0).index(),n.nextTick((function(){t.slideTo(o)}))):t.slideTo(o)}else t.slideTo(o)}};var v={loopCreate:function(){var t=this,i=t.params,a=t.$wrapperEl;a.children("."+i.slideClass+"."+i.slideDuplicateClass).remove();var r=a.children("."+i.slideClass);if(i.loopFillGroupWithBlank){var n=i.slidesPerGroup-r.length%i.slidesPerGroup;if(n!==i.slidesPerGroup){for(var o=0;or.length&&(t.loopedSlides=r.length);var d=[],h=[];r.each((function(e,i){var a=s(i);e=r.length-t.loopedSlides&&d.push(i),a.attr("data-swiper-slide-index",e)}));for(var p=0;p=0;c-=1)a.prepend(s(d[c].cloneNode(!0)).addClass(i.slideDuplicateClass))},loopFix:function(){this.emit("beforeLoopFix");var e,t=this.activeIndex,i=this.slides,s=this.loopedSlides,a=this.allowSlidePrev,r=this.allowSlideNext,n=this.snapGrid,o=this.rtlTranslate;this.allowSlidePrev=!0,this.allowSlideNext=!0;var l=-n[t]-this.getTranslate();if(t=i.length-s){e=-i.length+t+s,e+=s,this.slideTo(e,0,!1,!0)&&0!==l&&this.setTranslate((o?-this.translate:this.translate)-l)}this.allowSlidePrev=a,this.allowSlideNext=r,this.emit("loopFix")},loopDestroy:function(){var e=this.$wrapperEl,t=this.params,i=this.slides;e.children("."+t.slideClass+"."+t.slideDuplicateClass+",."+t.slideClass+"."+t.slideBlankClass).remove(),i.removeAttr("data-swiper-slide-index")}};var f={setGrabCursor:function(e){if(!(o.touch||!this.params.simulateTouch||this.params.watchOverflow&&this.isLocked||this.params.cssMode)){var t=this.el;t.style.cursor="move",t.style.cursor=e?"-webkit-grabbing":"-webkit-grab",t.style.cursor=e?"-moz-grabbin":"-moz-grab",t.style.cursor=e?"grabbing":"grab"}},unsetGrabCursor:function(){o.touch||this.params.watchOverflow&&this.isLocked||this.params.cssMode||(this.el.style.cursor="")}};var m,g,b,w,y,x,T,E,S,C,M,P,z,k,$,L={appendSlide:function(e){var t=this.$wrapperEl,i=this.params;if(i.loop&&this.loopDestroy(),"object"==typeof e&&"length"in e)for(var s=0;s=r)this.appendSlide(t);else{for(var n=a>e?a+1:a,l=[],d=r-1;d>=e;d-=1){var h=this.slides.eq(d);h.remove(),l.unshift(h)}if("object"==typeof t&&"length"in t){for(var p=0;pe?a+t.length:a}else i.append(t);for(var c=0;c=0||g.indexOf("Trident/")>=0,M=g.indexOf("Edge/")>=0,P=g.indexOf("Gecko/")>=0&&g.indexOf("Firefox/")>=0,z="Win32"===m,k=g.toLowerCase().indexOf("electron")>=0,$="MacIntel"===m,!T&&$&&o.touch&&(1024===w&&1366===y||834===w&&1194===y||834===w&&1112===y||768===w&&1024===y)&&(T=g.match(/(Version)\/([\d.]+)/),$=!1),b.ie=C,b.edge=M,b.firefox=P,x&&!z&&(b.os="android",b.osVersion=x[2],b.android=!0,b.androidChrome=g.toLowerCase().indexOf("chrome")>=0),(T||S||E)&&(b.os="ios",b.ios=!0),S&&!E&&(b.osVersion=S[2].replace(/_/g,"."),b.iphone=!0),T&&(b.osVersion=T[2].replace(/_/g,"."),b.ipad=!0),E&&(b.osVersion=E[3]?E[3].replace(/_/g,"."):null,b.ipod=!0),b.ios&&b.osVersion&&g.indexOf("Version/")>=0&&"10"===b.osVersion.split(".")[0]&&(b.osVersion=g.toLowerCase().split("version/")[1].split(" ")[0]),b.webView=!(!(S||T||E)||!g.match(/.*AppleWebKit(?!.*Safari)/i)&&!t.navigator.standalone)||t.matchMedia&&t.matchMedia("(display-mode: standalone)").matches,b.webview=b.webView,b.standalone=b.webView,b.desktop=!(b.ios||b.android)||k,b.desktop&&(b.electron=k,b.macos=$,b.windows=z,b.macos&&(b.os="macos"),b.windows&&(b.os="windows")),b.pixelRatio=t.devicePixelRatio||1,b);function D(i){var a=this.touchEventsData,r=this.params,o=this.touches;if(!this.animating||!r.preventInteractionOnTransition){var l=i;l.originalEvent&&(l=l.originalEvent);var d=s(l.target);if(("wrapper"!==r.touchEventsTarget||d.closest(this.wrapperEl).length)&&(a.isTouchEvent="touchstart"===l.type,(a.isTouchEvent||!("which"in l)||3!==l.which)&&!(!a.isTouchEvent&&"button"in l&&l.button>0||a.isTouched&&a.isMoved)))if(r.noSwiping&&d.closest(r.noSwipingSelector?r.noSwipingSelector:"."+r.noSwipingClass)[0])this.allowClick=!0;else if(!r.swipeHandler||d.closest(r.swipeHandler)[0]){o.currentX="touchstart"===l.type?l.targetTouches[0].pageX:l.pageX,o.currentY="touchstart"===l.type?l.targetTouches[0].pageY:l.pageY;var h=o.currentX,p=o.currentY,c=r.edgeSwipeDetection||r.iOSEdgeSwipeDetection,u=r.edgeSwipeThreshold||r.iOSEdgeSwipeThreshold;if(!c||!(h<=u||h>=t.screen.width-u)){if(n.extend(a,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=h,o.startY=p,a.touchStartTime=n.now(),this.allowClick=!0,this.updateSize(),this.swipeDirection=void 0,r.threshold>0&&(a.allowThresholdMove=!1),"touchstart"!==l.type){var v=!0;d.is(a.formElements)&&(v=!1),e.activeElement&&s(e.activeElement).is(a.formElements)&&e.activeElement!==d[0]&&e.activeElement.blur();var f=v&&this.allowTouchMove&&r.touchStartPreventDefault;(r.touchStartForcePreventDefault||f)&&l.preventDefault()}this.emit("touchStart",l)}}}}function O(t){var i=this.touchEventsData,a=this.params,r=this.touches,o=this.rtlTranslate,l=t;if(l.originalEvent&&(l=l.originalEvent),i.isTouched){if(!i.isTouchEvent||"mousemove"!==l.type){var d="touchmove"===l.type&&l.targetTouches&&(l.targetTouches[0]||l.changedTouches[0]),h="touchmove"===l.type?d.pageX:l.pageX,p="touchmove"===l.type?d.pageY:l.pageY;if(l.preventedByNestedSwiper)return r.startX=h,void(r.startY=p);if(!this.allowTouchMove)return this.allowClick=!1,void(i.isTouched&&(n.extend(r,{startX:h,startY:p,currentX:h,currentY:p}),i.touchStartTime=n.now()));if(i.isTouchEvent&&a.touchReleaseOnEdges&&!a.loop)if(this.isVertical()){if(pr.startY&&this.translate>=this.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(hr.startX&&this.translate>=this.minTranslate())return;if(i.isTouchEvent&&e.activeElement&&l.target===e.activeElement&&s(l.target).is(i.formElements))return i.isMoved=!0,void(this.allowClick=!1);if(i.allowTouchCallbacks&&this.emit("touchMove",l),!(l.targetTouches&&l.targetTouches.length>1)){r.currentX=h,r.currentY=p;var c=r.currentX-r.startX,u=r.currentY-r.startY;if(!(this.params.threshold&&Math.sqrt(Math.pow(c,2)+Math.pow(u,2))=25&&(v=180*Math.atan2(Math.abs(u),Math.abs(c))/Math.PI,i.isScrolling=this.isHorizontal()?v>a.touchAngle:90-v>a.touchAngle);if(i.isScrolling&&this.emit("touchMoveOpposite",l),void 0===i.startMoving&&(r.currentX===r.startX&&r.currentY===r.startY||(i.startMoving=!0)),i.isScrolling)i.isTouched=!1;else if(i.startMoving){this.allowClick=!1,a.cssMode||l.preventDefault(),a.touchMoveStopPropagation&&!a.nested&&l.stopPropagation(),i.isMoved||(a.loop&&this.loopFix(),i.startTranslate=this.getTranslate(),this.setTransition(0),this.animating&&this.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!a.grabCursor||!0!==this.allowSlideNext&&!0!==this.allowSlidePrev||this.setGrabCursor(!0),this.emit("sliderFirstMove",l)),this.emit("sliderMove",l),i.isMoved=!0;var f=this.isHorizontal()?c:u;r.diff=f,f*=a.touchRatio,o&&(f=-f),this.swipeDirection=f>0?"prev":"next",i.currentTranslate=f+i.startTranslate;var m=!0,g=a.resistanceRatio;if(a.touchReleaseOnEdges&&(g=0),f>0&&i.currentTranslate>this.minTranslate()?(m=!1,a.resistance&&(i.currentTranslate=this.minTranslate()-1+Math.pow(-this.minTranslate()+i.startTranslate+f,g))):f<0&&i.currentTranslatei.startTranslate&&(i.currentTranslate=i.startTranslate),a.threshold>0){if(!(Math.abs(f)>a.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,r.startX=r.currentX,r.startY=r.currentY,i.currentTranslate=i.startTranslate,void(r.diff=this.isHorizontal()?r.currentX-r.startX:r.currentY-r.startY)}a.followFinger&&!a.cssMode&&((a.freeMode||a.watchSlidesProgress||a.watchSlidesVisibility)&&(this.updateActiveIndex(),this.updateSlidesClasses()),a.freeMode&&(0===i.velocities.length&&i.velocities.push({position:r[this.isHorizontal()?"startX":"startY"],time:i.touchStartTime}),i.velocities.push({position:r[this.isHorizontal()?"currentX":"currentY"],time:n.now()})),this.updateProgress(i.currentTranslate),this.setTranslate(i.currentTranslate))}}}}}else i.startMoving&&i.isScrolling&&this.emit("touchMoveOpposite",l)}function A(e){var t=this,i=t.touchEventsData,s=t.params,a=t.touches,r=t.rtlTranslate,o=t.$wrapperEl,l=t.slidesGrid,d=t.snapGrid,h=e;if(h.originalEvent&&(h=h.originalEvent),i.allowTouchCallbacks&&t.emit("touchEnd",h),i.allowTouchCallbacks=!1,!i.isTouched)return i.isMoved&&s.grabCursor&&t.setGrabCursor(!1),i.isMoved=!1,void(i.startMoving=!1);s.grabCursor&&i.isMoved&&i.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);var p,c=n.now(),u=c-i.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(h),t.emit("tap click",h),u<300&&c-i.lastClickTime<300&&t.emit("doubleTap doubleClick",h)),i.lastClickTime=n.now(),n.nextTick((function(){t.destroyed||(t.allowClick=!0)})),!i.isTouched||!i.isMoved||!t.swipeDirection||0===a.diff||i.currentTranslate===i.startTranslate)return i.isTouched=!1,i.isMoved=!1,void(i.startMoving=!1);if(i.isTouched=!1,i.isMoved=!1,i.startMoving=!1,p=s.followFinger?r?t.translate:-t.translate:-i.currentTranslate,!s.cssMode)if(s.freeMode){if(p<-t.minTranslate())return void t.slideTo(t.activeIndex);if(p>-t.maxTranslate())return void(t.slides.length1){var v=i.velocities.pop(),f=i.velocities.pop(),m=v.position-f.position,g=v.time-f.time;t.velocity=m/g,t.velocity/=2,Math.abs(t.velocity)150||n.now()-v.time>300)&&(t.velocity=0)}else t.velocity=0;t.velocity*=s.freeModeMomentumVelocityRatio,i.velocities.length=0;var b=1e3*s.freeModeMomentumRatio,w=t.velocity*b,y=t.translate+w;r&&(y=-y);var x,T,E=!1,S=20*Math.abs(t.velocity)*s.freeModeMomentumBounceRatio;if(yt.minTranslate())s.freeModeMomentumBounce?(y-t.minTranslate()>S&&(y=t.minTranslate()+S),x=t.minTranslate(),E=!0,i.allowMomentumBounce=!0):y=t.minTranslate(),s.loop&&s.centeredSlides&&(T=!0);else if(s.freeModeSticky){for(var C,M=0;M-y){C=M;break}y=-(y=Math.abs(d[C]-y)=s.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}else{for(var k=0,$=t.slidesSizesGrid[0],L=0;L=l[L]&&p=l[L]&&(k=L,$=l[l.length-1]-l[l.length-2])}var D=(p-l[k])/$,O=ks.longSwipesMs){if(!s.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(D>=s.longSwipesRatio?t.slideTo(k+O):t.slideTo(k)),"prev"===t.swipeDirection&&(D>1-s.longSwipesRatio?t.slideTo(k+O):t.slideTo(k))}else{if(!s.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(h.target===t.navigation.nextEl||h.target===t.navigation.prevEl)?h.target===t.navigation.nextEl?t.slideTo(k+O):t.slideTo(k):("next"===t.swipeDirection&&t.slideTo(k+O),"prev"===t.swipeDirection&&t.slideTo(k))}}}function G(){var e=this.params,t=this.el;if(!t||0!==t.offsetWidth){e.breakpoints&&this.setBreakpoint();var i=this.allowSlideNext,s=this.allowSlidePrev,a=this.snapGrid;this.allowSlideNext=!0,this.allowSlidePrev=!0,this.updateSize(),this.updateSlides(),this.updateSlidesClasses(),("auto"===e.slidesPerView||e.slidesPerView>1)&&this.isEnd&&!this.params.centeredSlides?this.slideTo(this.slides.length-1,0,!1,!0):this.slideTo(this.activeIndex,0,!1,!0),this.autoplay&&this.autoplay.running&&this.autoplay.paused&&this.autoplay.run(),this.allowSlidePrev=s,this.allowSlideNext=i,this.params.watchOverflow&&a!==this.snapGrid&&this.checkOverflow()}}function H(e){this.allowClick||(this.params.preventClicks&&e.preventDefault(),this.params.preventClicksPropagation&&this.animating&&(e.stopPropagation(),e.stopImmediatePropagation()))}function B(){var e=this.wrapperEl;this.previousTranslate=this.translate,this.translate=this.isHorizontal()?-e.scrollLeft:-e.scrollTop,-0===this.translate&&(this.translate=0),this.updateActiveIndex(),this.updateSlidesClasses();var t=this.maxTranslate()-this.minTranslate();(0===t?0:(this.translate-this.minTranslate())/t)!==this.progress&&this.updateProgress(this.translate),this.emit("setTranslate",this.translate,!1)}var N=!1;function X(){}var V={init:!0,direction:"horizontal",touchEventsTarget:"container",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,preventInteractionOnTransition:!1,edgeSwipeDetection:!1,edgeSwipeThreshold:20,freeMode:!1,freeModeMomentum:!0,freeModeMomentumRatio:1,freeModeMomentumBounce:!0,freeModeMomentumBounceRatio:1,freeModeMomentumVelocityRatio:1,freeModeSticky:!1,freeModeMinimumVelocity:.02,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,spaceBetween:0,slidesPerView:1,slidesPerColumn:1,slidesPerColumnFill:"column",slidesPerGroup:1,slidesPerGroupSkip:0,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!1,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,watchSlidesVisibility:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-container-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0},Y={update:h,translate:p,transition:c,slide:u,loop:v,grabCursor:f,manipulation:L,events:{attachEvents:function(){var t=this.params,i=this.touchEvents,s=this.el,a=this.wrapperEl;this.onTouchStart=D.bind(this),this.onTouchMove=O.bind(this),this.onTouchEnd=A.bind(this),t.cssMode&&(this.onScroll=B.bind(this)),this.onClick=H.bind(this);var r=!!t.nested;if(!o.touch&&o.pointerEvents)s.addEventListener(i.start,this.onTouchStart,!1),e.addEventListener(i.move,this.onTouchMove,r),e.addEventListener(i.end,this.onTouchEnd,!1);else{if(o.touch){var n=!("touchstart"!==i.start||!o.passiveListener||!t.passiveListeners)&&{passive:!0,capture:!1};s.addEventListener(i.start,this.onTouchStart,n),s.addEventListener(i.move,this.onTouchMove,o.passiveListener?{passive:!1,capture:r}:r),s.addEventListener(i.end,this.onTouchEnd,n),i.cancel&&s.addEventListener(i.cancel,this.onTouchEnd,n),N||(e.addEventListener("touchstart",X),N=!0)}(t.simulateTouch&&!I.ios&&!I.android||t.simulateTouch&&!o.touch&&I.ios)&&(s.addEventListener("mousedown",this.onTouchStart,!1),e.addEventListener("mousemove",this.onTouchMove,r),e.addEventListener("mouseup",this.onTouchEnd,!1))}(t.preventClicks||t.preventClicksPropagation)&&s.addEventListener("click",this.onClick,!0),t.cssMode&&a.addEventListener("scroll",this.onScroll),t.updateOnWindowResize?this.on(I.ios||I.android?"resize orientationchange observerUpdate":"resize observerUpdate",G,!0):this.on("observerUpdate",G,!0)},detachEvents:function(){var t=this.params,i=this.touchEvents,s=this.el,a=this.wrapperEl,r=!!t.nested;if(!o.touch&&o.pointerEvents)s.removeEventListener(i.start,this.onTouchStart,!1),e.removeEventListener(i.move,this.onTouchMove,r),e.removeEventListener(i.end,this.onTouchEnd,!1);else{if(o.touch){var n=!("onTouchStart"!==i.start||!o.passiveListener||!t.passiveListeners)&&{passive:!0,capture:!1};s.removeEventListener(i.start,this.onTouchStart,n),s.removeEventListener(i.move,this.onTouchMove,r),s.removeEventListener(i.end,this.onTouchEnd,n),i.cancel&&s.removeEventListener(i.cancel,this.onTouchEnd,n)}(t.simulateTouch&&!I.ios&&!I.android||t.simulateTouch&&!o.touch&&I.ios)&&(s.removeEventListener("mousedown",this.onTouchStart,!1),e.removeEventListener("mousemove",this.onTouchMove,r),e.removeEventListener("mouseup",this.onTouchEnd,!1))}(t.preventClicks||t.preventClicksPropagation)&&s.removeEventListener("click",this.onClick,!0),t.cssMode&&a.removeEventListener("scroll",this.onScroll),this.off(I.ios||I.android?"resize orientationchange observerUpdate":"resize observerUpdate",G)}},breakpoints:{setBreakpoint:function(){var e=this.activeIndex,t=this.initialized,i=this.loopedSlides;void 0===i&&(i=0);var s=this.params,a=this.$el,r=s.breakpoints;if(r&&(!r||0!==Object.keys(r).length)){var o=this.getBreakpoint(r);if(o&&this.currentBreakpoint!==o){var l=o in r?r[o]:void 0;l&&["slidesPerView","spaceBetween","slidesPerGroup","slidesPerGroupSkip","slidesPerColumn"].forEach((function(e){var t=l[e];void 0!==t&&(l[e]="slidesPerView"!==e||"AUTO"!==t&&"auto"!==t?"slidesPerView"===e?parseFloat(t):parseInt(t,10):"auto")}));var d=l||this.originalParams,h=s.slidesPerColumn>1,p=d.slidesPerColumn>1;h&&!p?a.removeClass(s.containerModifierClass+"multirow "+s.containerModifierClass+"multirow-column"):!h&&p&&(a.addClass(s.containerModifierClass+"multirow"),"column"===d.slidesPerColumnFill&&a.addClass(s.containerModifierClass+"multirow-column"));var c=d.direction&&d.direction!==s.direction,u=s.loop&&(d.slidesPerView!==s.slidesPerView||c);c&&t&&this.changeDirection(),n.extend(this.params,d),n.extend(this,{allowTouchMove:this.params.allowTouchMove,allowSlideNext:this.params.allowSlideNext,allowSlidePrev:this.params.allowSlidePrev}),this.currentBreakpoint=o,u&&t&&(this.loopDestroy(),this.loopCreate(),this.updateSlides(),this.slideTo(e-i+this.loopedSlides,0,!1)),this.emit("breakpoint",d)}}},getBreakpoint:function(e){if(e){var i=!1,s=Object.keys(e).map((function(e){if("string"==typeof e&&0===e.indexOf("@")){var i=parseFloat(e.substr(1));return{value:t.innerHeight*i,point:e}}return{value:e,point:e}}));s.sort((function(e,t){return parseInt(e.value,10)-parseInt(t.value,10)}));for(var a=0;a0&&e.slidesOffsetBefore+e.spaceBetween*(this.slides.length-1)+this.slides[0].offsetWidth*this.slides.length;e.slidesOffsetBefore&&e.slidesOffsetAfter&&i?this.isLocked=i<=this.size:this.isLocked=1===this.snapGrid.length,this.allowSlideNext=!this.isLocked,this.allowSlidePrev=!this.isLocked,t!==this.isLocked&&this.emit(this.isLocked?"lock":"unlock"),t&&t!==this.isLocked&&(this.isEnd=!1,this.navigation.update())}},classes:{addClasses:function(){var e=this.classNames,t=this.params,i=this.rtl,s=this.$el,a=[];a.push("initialized"),a.push(t.direction),t.freeMode&&a.push("free-mode"),t.autoHeight&&a.push("autoheight"),i&&a.push("rtl"),t.slidesPerColumn>1&&(a.push("multirow"),"column"===t.slidesPerColumnFill&&a.push("multirow-column")),I.android&&a.push("android"),I.ios&&a.push("ios"),t.cssMode&&a.push("css-mode"),a.forEach((function(i){e.push(t.containerModifierClass+i)})),s.addClass(e.join(" "))},removeClasses:function(){var e=this.$el,t=this.classNames;e.removeClass(t.join(" "))}},images:{loadImage:function(e,i,s,a,r,n){var o;function l(){n&&n()}e.complete&&r?l():i?((o=new t.Image).onload=l,o.onerror=l,a&&(o.sizes=a),s&&(o.srcset=s),i&&(o.src=i)):l()},preloadImages:function(){var e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(var i=0;i1){var u=[];return c.each((function(e,i){var s=n.extend({},r,{el:i});u.push(new t(s))})),u}var v,f,m;return a.swiper=h,c.data("swiper",h),a&&a.shadowRoot&&a.shadowRoot.querySelector?(v=s(a.shadowRoot.querySelector("."+h.params.wrapperClass))).children=function(e){return c.children(e)}:v=c.children("."+h.params.wrapperClass),n.extend(h,{$el:c,el:a,$wrapperEl:v,wrapperEl:v[0],classNames:[],slides:s(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:function(){return"horizontal"===h.params.direction},isVertical:function(){return"vertical"===h.params.direction},rtl:"rtl"===a.dir.toLowerCase()||"rtl"===c.css("direction"),rtlTranslate:"horizontal"===h.params.direction&&("rtl"===a.dir.toLowerCase()||"rtl"===c.css("direction")),wrongRTL:"-webkit-box"===v.css("display"),activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:h.params.allowSlideNext,allowSlidePrev:h.params.allowSlidePrev,touchEvents:(f=["touchstart","touchmove","touchend","touchcancel"],m=["mousedown","mousemove","mouseup"],o.pointerEvents&&(m=["pointerdown","pointermove","pointerup"]),h.touchEventsTouch={start:f[0],move:f[1],end:f[2],cancel:f[3]},h.touchEventsDesktop={start:m[0],move:m[1],end:m[2]},o.touch||!h.params.simulateTouch?h.touchEventsTouch:h.touchEventsDesktop),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,formElements:"input, select, option, textarea, button, video, label",lastClickTime:n.now(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:h.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),h.useModules(),h.params.init&&h.init(),h}}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var i={extendedDefaults:{configurable:!0},defaults:{configurable:!0},Class:{configurable:!0},$:{configurable:!0}};return t.prototype.slidesPerViewDynamic=function(){var e=this.params,t=this.slides,i=this.slidesGrid,s=this.size,a=this.activeIndex,r=1;if(e.centeredSlides){for(var n,o=t[a].swiperSlideSize,l=a+1;ls&&(n=!0));for(var d=a-1;d>=0;d-=1)t[d]&&!n&&(r+=1,(o+=t[d].swiperSlideSize)>s&&(n=!0))}else for(var h=a+1;h1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0))||s(),i.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}function s(){var t=e.rtlTranslate?-1*e.translate:e.translate,i=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(i),e.updateActiveIndex(),e.updateSlidesClasses()}},t.prototype.changeDirection=function(e,t){void 0===t&&(t=!0);var i=this.params.direction;return e||(e="horizontal"===i?"vertical":"horizontal"),e===i||"horizontal"!==e&&"vertical"!==e?this:(this.$el.removeClass(""+this.params.containerModifierClass+i).addClass(""+this.params.containerModifierClass+e),this.params.direction=e,this.slides.each((function(t,i){"vertical"===e?i.style.width="":i.style.height=""})),this.emit("changeDirection"),t&&this.update(),this)},t.prototype.init=function(){this.initialized||(this.emit("beforeInit"),this.params.breakpoints&&this.setBreakpoint(),this.addClasses(),this.params.loop&&this.loopCreate(),this.updateSize(),this.updateSlides(),this.params.watchOverflow&&this.checkOverflow(),this.params.grabCursor&&this.setGrabCursor(),this.params.preloadImages&&this.preloadImages(),this.params.loop?this.slideTo(this.params.initialSlide+this.loopedSlides,0,this.params.runCallbacksOnInit):this.slideTo(this.params.initialSlide,0,this.params.runCallbacksOnInit),this.attachEvents(),this.initialized=!0,this.emit("init"))},t.prototype.destroy=function(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);var i=this,s=i.params,a=i.$el,r=i.$wrapperEl,o=i.slides;return void 0===i.params||i.destroyed?null:(i.emit("beforeDestroy"),i.initialized=!1,i.detachEvents(),s.loop&&i.loopDestroy(),t&&(i.removeClasses(),a.removeAttr("style"),r.removeAttr("style"),o&&o.length&&o.removeClass([s.slideVisibleClass,s.slideActiveClass,s.slideNextClass,s.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),i.emit("destroy"),Object.keys(i.eventsListeners).forEach((function(e){i.off(e)})),!1!==e&&(i.$el[0].swiper=null,i.$el.data("swiper",null),n.deleteProps(i)),i.destroyed=!0,null)},t.extendDefaults=function(e){n.extend(F,e)},i.extendedDefaults.get=function(){return F},i.defaults.get=function(){return V},i.Class.get=function(){return e},i.$.get=function(){return s},Object.defineProperties(t,i),t}(l),R={name:"device",proto:{device:I},static:{device:I}},q={name:"support",proto:{support:o},static:{support:o}},j={isEdge:!!t.navigator.userAgent.match(/Edge/g),isSafari:function(){var e=t.navigator.userAgent.toLowerCase();return e.indexOf("safari")>=0&&e.indexOf("chrome")<0&&e.indexOf("android")<0}(),isUiWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(t.navigator.userAgent)},K={name:"browser",proto:{browser:j},static:{browser:j}},U={name:"resize",create:function(){var e=this;n.extend(e,{resize:{resizeHandler:function(){e&&!e.destroyed&&e.initialized&&(e.emit("beforeResize"),e.emit("resize"))},orientationChangeHandler:function(){e&&!e.destroyed&&e.initialized&&e.emit("orientationchange")}}})},on:{init:function(){t.addEventListener("resize",this.resize.resizeHandler),t.addEventListener("orientationchange",this.resize.orientationChangeHandler)},destroy:function(){t.removeEventListener("resize",this.resize.resizeHandler),t.removeEventListener("orientationchange",this.resize.orientationChangeHandler)}}},_={func:t.MutationObserver||t.WebkitMutationObserver,attach:function(e,i){void 0===i&&(i={});var s=this,a=new(0,_.func)((function(e){if(1!==e.length){var i=function(){s.emit("observerUpdate",e[0])};t.requestAnimationFrame?t.requestAnimationFrame(i):t.setTimeout(i,0)}else s.emit("observerUpdate",e[0])}));a.observe(e,{attributes:void 0===i.attributes||i.attributes,childList:void 0===i.childList||i.childList,characterData:void 0===i.characterData||i.characterData}),s.observer.observers.push(a)},init:function(){if(o.observer&&this.params.observer){if(this.params.observeParents)for(var e=this.$el.parents(),t=0;tT)&&t.$wrapperEl.find("."+t.params.slideClass+'[data-swiper-slide-index="'+P+'"]').remove();for(var z=0;z=x&&z<=T&&(void 0===c||e?M.push(z):(z>c&&M.push(z),z'+e+"");return a.attr("data-swiper-slide-index")||a.attr("data-swiper-slide-index",t),i.cache&&(this.virtual.cache[t]=a),a},appendSlide:function(e){if("object"==typeof e&&"length"in e)for(var t=0;t=0;i-=1)this.virtual.slides.splice(e[i],1),this.params.virtual.cache&&delete this.virtual.cache[e[i]],e[i]0&&0===this.$el.parents("."+this.params.slideActiveClass).length)return;var o=t.innerWidth,l=t.innerHeight,d=this.$el.offset();s&&(d.left-=this.$el[0].scrollLeft);for(var h=[[d.left,d.top],[d.left+this.width,d.top],[d.left,d.top+this.height],[d.left+this.width,d.top+this.height]],p=0;p=0&&c[0]<=o&&c[1]>=0&&c[1]<=l&&(n=!0)}if(!n)return}this.isHorizontal()?(33!==r&&34!==r&&37!==r&&39!==r||(a.preventDefault?a.preventDefault():a.returnValue=!1),(34!==r&&39!==r||s)&&(33!==r&&37!==r||!s)||this.slideNext(),(33!==r&&37!==r||s)&&(34!==r&&39!==r||!s)||this.slidePrev()):(33!==r&&34!==r&&38!==r&&40!==r||(a.preventDefault?a.preventDefault():a.returnValue=!1),34!==r&&40!==r||this.slideNext(),33!==r&&38!==r||this.slidePrev()),this.emit("keyPress",r)}},enable:function(){this.keyboard.enabled||(s(e).on("keydown",this.keyboard.handle),this.keyboard.enabled=!0)},disable:function(){this.keyboard.enabled&&(s(e).off("keydown",this.keyboard.handle),this.keyboard.enabled=!1)}},te={name:"keyboard",params:{keyboard:{enabled:!1,onlyInViewport:!0}},create:function(){n.extend(this,{keyboard:{enabled:!1,enable:ee.enable.bind(this),disable:ee.disable.bind(this),handle:ee.handle.bind(this)}})},on:{init:function(){this.params.keyboard.enabled&&this.keyboard.enable()},destroy:function(){this.keyboard.enabled&&this.keyboard.disable()}}};var ie={lastScrollTime:n.now(),lastEventBeforeSnap:void 0,recentWheelEvents:[],event:function(){return t.navigator.userAgent.indexOf("firefox")>-1?"DOMMouseScroll":function(){var t="onwheel"in e;if(!t){var i=e.createElement("div");i.setAttribute("onwheel","return;"),t="function"==typeof i.onwheel}return!t&&e.implementation&&e.implementation.hasFeature&&!0!==e.implementation.hasFeature("","")&&(t=e.implementation.hasFeature("Events.wheel","3.0")),t}()?"wheel":"mousewheel"},normalize:function(e){var t=0,i=0,s=0,a=0;return"detail"in e&&(i=e.detail),"wheelDelta"in e&&(i=-e.wheelDelta/120),"wheelDeltaY"in e&&(i=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=i,i=0),s=10*t,a=10*i,"deltaY"in e&&(a=e.deltaY),"deltaX"in e&&(s=e.deltaX),e.shiftKey&&!s&&(s=a,a=0),(s||a)&&e.deltaMode&&(1===e.deltaMode?(s*=40,a*=40):(s*=800,a*=800)),s&&!t&&(t=s<1?-1:1),a&&!i&&(i=a<1?-1:1),{spinX:t,spinY:i,pixelX:s,pixelY:a}},handleMouseEnter:function(){this.mouseEntered=!0},handleMouseLeave:function(){this.mouseEntered=!1},handle:function(e){var t=e,i=this,a=i.params.mousewheel;i.params.cssMode&&t.preventDefault();var r=i.$el;if("container"!==i.params.mousewheel.eventsTarged&&(r=s(i.params.mousewheel.eventsTarged)),!i.mouseEntered&&!r[0].contains(t.target)&&!a.releaseOnEdges)return!0;t.originalEvent&&(t=t.originalEvent);var o=0,l=i.rtlTranslate?-1:1,d=ie.normalize(t);if(a.forceToAxis)if(i.isHorizontal()){if(!(Math.abs(d.pixelX)>Math.abs(d.pixelY)))return!0;o=d.pixelX*l}else{if(!(Math.abs(d.pixelY)>Math.abs(d.pixelX)))return!0;o=d.pixelY}else o=Math.abs(d.pixelX)>Math.abs(d.pixelY)?-d.pixelX*l:-d.pixelY;if(0===o)return!0;if(a.invert&&(o=-o),i.params.freeMode){var h={time:n.now(),delta:Math.abs(o),direction:Math.sign(o)},p=i.mousewheel.lastEventBeforeSnap,c=p&&h.time=i.minTranslate()&&(u=i.minTranslate()),u<=i.maxTranslate()&&(u=i.maxTranslate()),i.setTransition(0),i.setTranslate(u),i.updateProgress(),i.updateActiveIndex(),i.updateSlidesClasses(),(!v&&i.isBeginning||!f&&i.isEnd)&&i.updateSlidesClasses(),i.params.freeModeSticky){clearTimeout(i.mousewheel.timeout),i.mousewheel.timeout=void 0;var m=i.mousewheel.recentWheelEvents;m.length>=15&&m.shift();var g=m.length?m[m.length-1]:void 0,b=m[0];if(m.push(h),g&&(h.delta>g.delta||h.direction!==g.direction))m.splice(0);else if(m.length>=15&&h.time-b.time<500&&b.delta-h.delta>=1&&h.delta<=6){var w=o>0?.8:.2;i.mousewheel.lastEventBeforeSnap=h,m.splice(0),i.mousewheel.timeout=n.nextTick((function(){i.slideToClosest(i.params.speed,!0,void 0,w)}),0)}i.mousewheel.timeout||(i.mousewheel.timeout=n.nextTick((function(){i.mousewheel.lastEventBeforeSnap=h,m.splice(0),i.slideToClosest(i.params.speed,!0,void 0,.5)}),500))}if(c||i.emit("scroll",t),i.params.autoplay&&i.params.autoplayDisableOnInteraction&&i.autoplay.stop(),u===i.minTranslate()||u===i.maxTranslate())return!0}}else{var y={time:n.now(),delta:Math.abs(o),direction:Math.sign(o),raw:e},x=i.mousewheel.recentWheelEvents;x.length>=2&&x.shift();var T=x.length?x[x.length-1]:void 0;if(x.push(y),T?(y.direction!==T.direction||y.delta>T.delta)&&i.mousewheel.animateSlider(y):i.mousewheel.animateSlider(y),i.mousewheel.releaseScroll(y))return!0}return t.preventDefault?t.preventDefault():t.returnValue=!1,!1},animateSlider:function(e){return e.delta>=6&&n.now()-this.mousewheel.lastScrollTime<60||(e.direction<0?this.isEnd&&!this.params.loop||this.animating||(this.slideNext(),this.emit("scroll",e.raw)):this.isBeginning&&!this.params.loop||this.animating||(this.slidePrev(),this.emit("scroll",e.raw)),this.mousewheel.lastScrollTime=(new t.Date).getTime(),!1)},releaseScroll:function(e){var t=this.params.mousewheel;if(e.direction<0){if(this.isEnd&&!this.params.loop&&t.releaseOnEdges)return!0}else if(this.isBeginning&&!this.params.loop&&t.releaseOnEdges)return!0;return!1},enable:function(){var e=ie.event();if(this.params.cssMode)return this.wrapperEl.removeEventListener(e,this.mousewheel.handle),!0;if(!e)return!1;if(this.mousewheel.enabled)return!1;var t=this.$el;return"container"!==this.params.mousewheel.eventsTarged&&(t=s(this.params.mousewheel.eventsTarged)),t.on("mouseenter",this.mousewheel.handleMouseEnter),t.on("mouseleave",this.mousewheel.handleMouseLeave),t.on(e,this.mousewheel.handle),this.mousewheel.enabled=!0,!0},disable:function(){var e=ie.event();if(this.params.cssMode)return this.wrapperEl.addEventListener(e,this.mousewheel.handle),!0;if(!e)return!1;if(!this.mousewheel.enabled)return!1;var t=this.$el;return"container"!==this.params.mousewheel.eventsTarged&&(t=s(this.params.mousewheel.eventsTarged)),t.off(e,this.mousewheel.handle),this.mousewheel.enabled=!1,!0}},se={update:function(){var e=this.params.navigation;if(!this.params.loop){var t=this.navigation,i=t.$nextEl,s=t.$prevEl;s&&s.length>0&&(this.isBeginning?s.addClass(e.disabledClass):s.removeClass(e.disabledClass),s[this.params.watchOverflow&&this.isLocked?"addClass":"removeClass"](e.lockClass)),i&&i.length>0&&(this.isEnd?i.addClass(e.disabledClass):i.removeClass(e.disabledClass),i[this.params.watchOverflow&&this.isLocked?"addClass":"removeClass"](e.lockClass))}},onPrevClick:function(e){e.preventDefault(),this.isBeginning&&!this.params.loop||this.slidePrev()},onNextClick:function(e){e.preventDefault(),this.isEnd&&!this.params.loop||this.slideNext()},init:function(){var e,t,i=this.params.navigation;(i.nextEl||i.prevEl)&&(i.nextEl&&(e=s(i.nextEl),this.params.uniqueNavElements&&"string"==typeof i.nextEl&&e.length>1&&1===this.$el.find(i.nextEl).length&&(e=this.$el.find(i.nextEl))),i.prevEl&&(t=s(i.prevEl),this.params.uniqueNavElements&&"string"==typeof i.prevEl&&t.length>1&&1===this.$el.find(i.prevEl).length&&(t=this.$el.find(i.prevEl))),e&&e.length>0&&e.on("click",this.navigation.onNextClick),t&&t.length>0&&t.on("click",this.navigation.onPrevClick),n.extend(this.navigation,{$nextEl:e,nextEl:e&&e[0],$prevEl:t,prevEl:t&&t[0]}))},destroy:function(){var e=this.navigation,t=e.$nextEl,i=e.$prevEl;t&&t.length&&(t.off("click",this.navigation.onNextClick),t.removeClass(this.params.navigation.disabledClass)),i&&i.length&&(i.off("click",this.navigation.onPrevClick),i.removeClass(this.params.navigation.disabledClass))}},ae={update:function(){var e=this.rtl,t=this.params.pagination;if(t.el&&this.pagination.el&&this.pagination.$el&&0!==this.pagination.$el.length){var i,a=this.virtual&&this.params.virtual.enabled?this.virtual.slides.length:this.slides.length,r=this.pagination.$el,n=this.params.loop?Math.ceil((a-2*this.loopedSlides)/this.params.slidesPerGroup):this.snapGrid.length;if(this.params.loop?((i=Math.ceil((this.activeIndex-this.loopedSlides)/this.params.slidesPerGroup))>a-1-2*this.loopedSlides&&(i-=a-2*this.loopedSlides),i>n-1&&(i-=n),i<0&&"bullets"!==this.params.paginationType&&(i=n+i)):i=void 0!==this.snapIndex?this.snapIndex:this.activeIndex||0,"bullets"===t.type&&this.pagination.bullets&&this.pagination.bullets.length>0){var o,l,d,h=this.pagination.bullets;if(t.dynamicBullets&&(this.pagination.bulletSize=h.eq(0)[this.isHorizontal()?"outerWidth":"outerHeight"](!0),r.css(this.isHorizontal()?"width":"height",this.pagination.bulletSize*(t.dynamicMainBullets+4)+"px"),t.dynamicMainBullets>1&&void 0!==this.previousIndex&&(this.pagination.dynamicBulletIndex+=i-this.previousIndex,this.pagination.dynamicBulletIndex>t.dynamicMainBullets-1?this.pagination.dynamicBulletIndex=t.dynamicMainBullets-1:this.pagination.dynamicBulletIndex<0&&(this.pagination.dynamicBulletIndex=0)),o=i-this.pagination.dynamicBulletIndex,d=((l=o+(Math.min(h.length,t.dynamicMainBullets)-1))+o)/2),h.removeClass(t.bulletActiveClass+" "+t.bulletActiveClass+"-next "+t.bulletActiveClass+"-next-next "+t.bulletActiveClass+"-prev "+t.bulletActiveClass+"-prev-prev "+t.bulletActiveClass+"-main"),r.length>1)h.each((function(e,a){var r=s(a),n=r.index();n===i&&r.addClass(t.bulletActiveClass),t.dynamicBullets&&(n>=o&&n<=l&&r.addClass(t.bulletActiveClass+"-main"),n===o&&r.prev().addClass(t.bulletActiveClass+"-prev").prev().addClass(t.bulletActiveClass+"-prev-prev"),n===l&&r.next().addClass(t.bulletActiveClass+"-next").next().addClass(t.bulletActiveClass+"-next-next"))}));else{var p=h.eq(i),c=p.index();if(p.addClass(t.bulletActiveClass),t.dynamicBullets){for(var u=h.eq(o),v=h.eq(l),f=o;f<=l;f+=1)h.eq(f).addClass(t.bulletActiveClass+"-main");if(this.params.loop)if(c>=h.length-t.dynamicMainBullets){for(var m=t.dynamicMainBullets;m>=0;m-=1)h.eq(h.length-m).addClass(t.bulletActiveClass+"-main");h.eq(h.length-t.dynamicMainBullets-1).addClass(t.bulletActiveClass+"-prev")}else u.prev().addClass(t.bulletActiveClass+"-prev").prev().addClass(t.bulletActiveClass+"-prev-prev"),v.next().addClass(t.bulletActiveClass+"-next").next().addClass(t.bulletActiveClass+"-next-next");else u.prev().addClass(t.bulletActiveClass+"-prev").prev().addClass(t.bulletActiveClass+"-prev-prev"),v.next().addClass(t.bulletActiveClass+"-next").next().addClass(t.bulletActiveClass+"-next-next")}}if(t.dynamicBullets){var g=Math.min(h.length,t.dynamicMainBullets+4),b=(this.pagination.bulletSize*g-this.pagination.bulletSize)/2-d*this.pagination.bulletSize,w=e?"right":"left";h.css(this.isHorizontal()?w:"top",b+"px")}}if("fraction"===t.type&&(r.find("."+t.currentClass).text(t.formatFractionCurrent(i+1)),r.find("."+t.totalClass).text(t.formatFractionTotal(n))),"progressbar"===t.type){var y;y=t.progressbarOpposite?this.isHorizontal()?"vertical":"horizontal":this.isHorizontal()?"horizontal":"vertical";var x=(i+1)/n,T=1,E=1;"horizontal"===y?T=x:E=x,r.find("."+t.progressbarFillClass).transform("translate3d(0,0,0) scaleX("+T+") scaleY("+E+")").transition(this.params.speed)}"custom"===t.type&&t.renderCustom?(r.html(t.renderCustom(this,i+1,n)),this.emit("paginationRender",this,r[0])):this.emit("paginationUpdate",this,r[0]),r[this.params.watchOverflow&&this.isLocked?"addClass":"removeClass"](t.lockClass)}},render:function(){var e=this.params.pagination;if(e.el&&this.pagination.el&&this.pagination.$el&&0!==this.pagination.$el.length){var t=this.virtual&&this.params.virtual.enabled?this.virtual.slides.length:this.slides.length,i=this.pagination.$el,s="";if("bullets"===e.type){for(var a=this.params.loop?Math.ceil((t-2*this.loopedSlides)/this.params.slidesPerGroup):this.snapGrid.length,r=0;r";i.html(s),this.pagination.bullets=i.find("."+e.bulletClass)}"fraction"===e.type&&(s=e.renderFraction?e.renderFraction.call(this,e.currentClass,e.totalClass):' / ',i.html(s)),"progressbar"===e.type&&(s=e.renderProgressbar?e.renderProgressbar.call(this,e.progressbarFillClass):'',i.html(s)),"custom"!==e.type&&this.emit("paginationRender",this.pagination.$el[0])}},init:function(){var e=this,t=e.params.pagination;if(t.el){var i=s(t.el);0!==i.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&i.length>1&&1===e.$el.find(t.el).length&&(i=e.$el.find(t.el)),"bullets"===t.type&&t.clickable&&i.addClass(t.clickableClass),i.addClass(t.modifierClass+t.type),"bullets"===t.type&&t.dynamicBullets&&(i.addClass(""+t.modifierClass+t.type+"-dynamic"),e.pagination.dynamicBulletIndex=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&i.addClass(t.progressbarOppositeClass),t.clickable&&i.on("click","."+t.bulletClass,(function(t){t.preventDefault();var i=s(this).index()*e.params.slidesPerGroup;e.params.loop&&(i+=e.loopedSlides),e.slideTo(i)})),n.extend(e.pagination,{$el:i,el:i[0]}))}},destroy:function(){var e=this.params.pagination;if(e.el&&this.pagination.el&&this.pagination.$el&&0!==this.pagination.$el.length){var t=this.pagination.$el;t.removeClass(e.hiddenClass),t.removeClass(e.modifierClass+e.type),this.pagination.bullets&&this.pagination.bullets.removeClass(e.bulletActiveClass),e.clickable&&t.off("click","."+e.bulletClass)}}},re={setTranslate:function(){if(this.params.scrollbar.el&&this.scrollbar.el){var e=this.scrollbar,t=this.rtlTranslate,i=this.progress,s=e.dragSize,a=e.trackSize,r=e.$dragEl,n=e.$el,o=this.params.scrollbar,l=s,d=(a-s)*i;t?(d=-d)>0?(l=s-d,d=0):-d+s>a&&(l=a+d):d<0?(l=s+d,d=0):d+s>a&&(l=a-d),this.isHorizontal()?(r.transform("translate3d("+d+"px, 0, 0)"),r[0].style.width=l+"px"):(r.transform("translate3d(0px, "+d+"px, 0)"),r[0].style.height=l+"px"),o.hide&&(clearTimeout(this.scrollbar.timeout),n[0].style.opacity=1,this.scrollbar.timeout=setTimeout((function(){n[0].style.opacity=0,n.transition(400)}),1e3))}},setTransition:function(e){this.params.scrollbar.el&&this.scrollbar.el&&this.scrollbar.$dragEl.transition(e)},updateSize:function(){if(this.params.scrollbar.el&&this.scrollbar.el){var e=this.scrollbar,t=e.$dragEl,i=e.$el;t[0].style.width="",t[0].style.height="";var s,a=this.isHorizontal()?i[0].offsetWidth:i[0].offsetHeight,r=this.size/this.virtualSize,o=r*(a/this.size);s="auto"===this.params.scrollbar.dragSize?a*r:parseInt(this.params.scrollbar.dragSize,10),this.isHorizontal()?t[0].style.width=s+"px":t[0].style.height=s+"px",i[0].style.display=r>=1?"none":"",this.params.scrollbar.hide&&(i[0].style.opacity=0),n.extend(e,{trackSize:a,divider:r,moveDivider:o,dragSize:s}),e.$el[this.params.watchOverflow&&this.isLocked?"addClass":"removeClass"](this.params.scrollbar.lockClass)}},getPointerPosition:function(e){return this.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientX:e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientY:e.clientY},setDragPosition:function(e){var t,i=this.scrollbar,s=this.rtlTranslate,a=i.$el,r=i.dragSize,n=i.trackSize,o=i.dragStartPos;t=(i.getPointerPosition(e)-a.offset()[this.isHorizontal()?"left":"top"]-(null!==o?o:r/2))/(n-r),t=Math.max(Math.min(t,1),0),s&&(t=1-t);var l=this.minTranslate()+(this.maxTranslate()-this.minTranslate())*t;this.updateProgress(l),this.setTranslate(l),this.updateActiveIndex(),this.updateSlidesClasses()},onDragStart:function(e){var t=this.params.scrollbar,i=this.scrollbar,s=this.$wrapperEl,a=i.$el,r=i.$dragEl;this.scrollbar.isTouched=!0,this.scrollbar.dragStartPos=e.target===r[0]||e.target===r?i.getPointerPosition(e)-e.target.getBoundingClientRect()[this.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),s.transition(100),r.transition(100),i.setDragPosition(e),clearTimeout(this.scrollbar.dragTimeout),a.transition(0),t.hide&&a.css("opacity",1),this.params.cssMode&&this.$wrapperEl.css("scroll-snap-type","none"),this.emit("scrollbarDragStart",e)},onDragMove:function(e){var t=this.scrollbar,i=this.$wrapperEl,s=t.$el,a=t.$dragEl;this.scrollbar.isTouched&&(e.preventDefault?e.preventDefault():e.returnValue=!1,t.setDragPosition(e),i.transition(0),s.transition(0),a.transition(0),this.emit("scrollbarDragMove",e))},onDragEnd:function(e){var t=this.params.scrollbar,i=this.scrollbar,s=this.$wrapperEl,a=i.$el;this.scrollbar.isTouched&&(this.scrollbar.isTouched=!1,this.params.cssMode&&(this.$wrapperEl.css("scroll-snap-type",""),s.transition("")),t.hide&&(clearTimeout(this.scrollbar.dragTimeout),this.scrollbar.dragTimeout=n.nextTick((function(){a.css("opacity",0),a.transition(400)}),1e3)),this.emit("scrollbarDragEnd",e),t.snapOnRelease&&this.slideToClosest())},enableDraggable:function(){if(this.params.scrollbar.el){var t=this.scrollbar,i=this.touchEventsTouch,s=this.touchEventsDesktop,a=this.params,r=t.$el[0],n=!(!o.passiveListener||!a.passiveListeners)&&{passive:!1,capture:!1},l=!(!o.passiveListener||!a.passiveListeners)&&{passive:!0,capture:!1};o.touch?(r.addEventListener(i.start,this.scrollbar.onDragStart,n),r.addEventListener(i.move,this.scrollbar.onDragMove,n),r.addEventListener(i.end,this.scrollbar.onDragEnd,l)):(r.addEventListener(s.start,this.scrollbar.onDragStart,n),e.addEventListener(s.move,this.scrollbar.onDragMove,n),e.addEventListener(s.end,this.scrollbar.onDragEnd,l))}},disableDraggable:function(){if(this.params.scrollbar.el){var t=this.scrollbar,i=this.touchEventsTouch,s=this.touchEventsDesktop,a=this.params,r=t.$el[0],n=!(!o.passiveListener||!a.passiveListeners)&&{passive:!1,capture:!1},l=!(!o.passiveListener||!a.passiveListeners)&&{passive:!0,capture:!1};o.touch?(r.removeEventListener(i.start,this.scrollbar.onDragStart,n),r.removeEventListener(i.move,this.scrollbar.onDragMove,n),r.removeEventListener(i.end,this.scrollbar.onDragEnd,l)):(r.removeEventListener(s.start,this.scrollbar.onDragStart,n),e.removeEventListener(s.move,this.scrollbar.onDragMove,n),e.removeEventListener(s.end,this.scrollbar.onDragEnd,l))}},init:function(){if(this.params.scrollbar.el){var e=this.scrollbar,t=this.$el,i=this.params.scrollbar,a=s(i.el);this.params.uniqueNavElements&&"string"==typeof i.el&&a.length>1&&1===t.find(i.el).length&&(a=t.find(i.el));var r=a.find("."+this.params.scrollbar.dragClass);0===r.length&&(r=s('
'),a.append(r)),n.extend(e,{$el:a,el:a[0],$dragEl:r,dragEl:r[0]}),i.draggable&&e.enableDraggable()}},destroy:function(){this.scrollbar.disableDraggable()}},ne={setTransform:function(e,t){var i=this.rtl,a=s(e),r=i?-1:1,n=a.attr("data-swiper-parallax")||"0",o=a.attr("data-swiper-parallax-x"),l=a.attr("data-swiper-parallax-y"),d=a.attr("data-swiper-parallax-scale"),h=a.attr("data-swiper-parallax-opacity");if(o||l?(o=o||"0",l=l||"0"):this.isHorizontal()?(o=n,l="0"):(l=n,o="0"),o=o.indexOf("%")>=0?parseInt(o,10)*t*r+"%":o*t*r+"px",l=l.indexOf("%")>=0?parseInt(l,10)*t+"%":l*t+"px",null!=h){var p=h-(h-1)*(1-Math.abs(t));a[0].style.opacity=p}if(null==d)a.transform("translate3d("+o+", "+l+", 0px)");else{var c=d-(d-1)*(1-Math.abs(t));a.transform("translate3d("+o+", "+l+", 0px) scale("+c+")")}},setTranslate:function(){var e=this,t=e.$el,i=e.slides,a=e.progress,r=e.snapGrid;t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t,i){e.parallax.setTransform(i,a)})),i.each((function(t,i){var n=i.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(n+=Math.ceil(t/2)-a*(r.length-1)),n=Math.min(Math.max(n,-1),1),s(i).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t,i){e.parallax.setTransform(i,n)}))}))},setTransition:function(e){void 0===e&&(e=this.params.speed);this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t,i){var a=s(i),r=parseInt(a.attr("data-swiper-parallax-duration"),10)||e;0===e&&(r=0),a.transition(r)}))}},oe={getDistanceBetweenTouches:function(e){if(e.targetTouches.length<2)return 1;var t=e.targetTouches[0].pageX,i=e.targetTouches[0].pageY,s=e.targetTouches[1].pageX,a=e.targetTouches[1].pageY;return Math.sqrt(Math.pow(s-t,2)+Math.pow(a-i,2))},onGestureStart:function(e){var t=this.params.zoom,i=this.zoom,a=i.gesture;if(i.fakeGestureTouched=!1,i.fakeGestureMoved=!1,!o.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;i.fakeGestureTouched=!0,a.scaleStart=oe.getDistanceBetweenTouches(e)}a.$slideEl&&a.$slideEl.length||(a.$slideEl=s(e.target).closest("."+this.params.slideClass),0===a.$slideEl.length&&(a.$slideEl=this.slides.eq(this.activeIndex)),a.$imageEl=a.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),a.$imageWrapEl=a.$imageEl.parent("."+t.containerClass),a.maxRatio=a.$imageWrapEl.attr("data-swiper-zoom")||t.maxRatio,0!==a.$imageWrapEl.length)?(a.$imageEl.transition(0),this.zoom.isScaling=!0):a.$imageEl=void 0},onGestureChange:function(e){var t=this.params.zoom,i=this.zoom,s=i.gesture;if(!o.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;i.fakeGestureMoved=!0,s.scaleMove=oe.getDistanceBetweenTouches(e)}s.$imageEl&&0!==s.$imageEl.length&&(o.gestures?i.scale=e.scale*i.currentScale:i.scale=s.scaleMove/s.scaleStart*i.currentScale,i.scale>s.maxRatio&&(i.scale=s.maxRatio-1+Math.pow(i.scale-s.maxRatio+1,.5)),i.scales.touchesStart.x))return void(s.isTouched=!1);if(!this.isHorizontal()&&(Math.floor(s.minY)===Math.floor(s.startY)&&s.touchesCurrent.ys.touchesStart.y))return void(s.isTouched=!1)}e.preventDefault(),e.stopPropagation(),s.isMoved=!0,s.currentX=s.touchesCurrent.x-s.touchesStart.x+s.startX,s.currentY=s.touchesCurrent.y-s.touchesStart.y+s.startY,s.currentXs.maxX&&(s.currentX=s.maxX-1+Math.pow(s.currentX-s.maxX+1,.8)),s.currentYs.maxY&&(s.currentY=s.maxY-1+Math.pow(s.currentY-s.maxY+1,.8)),a.prevPositionX||(a.prevPositionX=s.touchesCurrent.x),a.prevPositionY||(a.prevPositionY=s.touchesCurrent.y),a.prevTime||(a.prevTime=Date.now()),a.x=(s.touchesCurrent.x-a.prevPositionX)/(Date.now()-a.prevTime)/2,a.y=(s.touchesCurrent.y-a.prevPositionY)/(Date.now()-a.prevTime)/2,Math.abs(s.touchesCurrent.x-a.prevPositionX)<2&&(a.x=0),Math.abs(s.touchesCurrent.y-a.prevPositionY)<2&&(a.y=0),a.prevPositionX=s.touchesCurrent.x,a.prevPositionY=s.touchesCurrent.y,a.prevTime=Date.now(),i.$imageWrapEl.transform("translate3d("+s.currentX+"px, "+s.currentY+"px,0)")}}},onTouchEnd:function(){var e=this.zoom,t=e.gesture,i=e.image,s=e.velocity;if(t.$imageEl&&0!==t.$imageEl.length){if(!i.isTouched||!i.isMoved)return i.isTouched=!1,void(i.isMoved=!1);i.isTouched=!1,i.isMoved=!1;var a=300,r=300,n=s.x*a,o=i.currentX+n,l=s.y*r,d=i.currentY+l;0!==s.x&&(a=Math.abs((o-i.currentX)/s.x)),0!==s.y&&(r=Math.abs((d-i.currentY)/s.y));var h=Math.max(a,r);i.currentX=o,i.currentY=d;var p=i.width*e.scale,c=i.height*e.scale;i.minX=Math.min(t.slideWidth/2-p/2,0),i.maxX=-i.minX,i.minY=Math.min(t.slideHeight/2-c/2,0),i.maxY=-i.minY,i.currentX=Math.max(Math.min(i.currentX,i.maxX),i.minX),i.currentY=Math.max(Math.min(i.currentY,i.maxY),i.minY),t.$imageWrapEl.transition(h).transform("translate3d("+i.currentX+"px, "+i.currentY+"px,0)")}},onTransitionEnd:function(){var e=this.zoom,t=e.gesture;t.$slideEl&&this.previousIndex!==this.activeIndex&&(t.$imageEl.transform("translate3d(0,0,0) scale(1)"),t.$imageWrapEl.transform("translate3d(0,0,0)"),e.scale=1,e.currentScale=1,t.$slideEl=void 0,t.$imageEl=void 0,t.$imageWrapEl=void 0)},toggle:function(e){var t=this.zoom;t.scale&&1!==t.scale?t.out():t.in(e)},in:function(e){var t,i,s,a,r,n,o,l,d,h,p,c,u,v,f,m,g=this.zoom,b=this.params.zoom,w=g.gesture,y=g.image;(w.$slideEl||(w.$slideEl=this.slides.eq(this.activeIndex),w.$imageEl=w.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),w.$imageWrapEl=w.$imageEl.parent("."+b.containerClass)),w.$imageEl&&0!==w.$imageEl.length)&&(w.$slideEl.addClass(""+b.zoomedSlideClass),void 0===y.touchesStart.x&&e?(t="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,i="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(t=y.touchesStart.x,i=y.touchesStart.y),g.scale=w.$imageWrapEl.attr("data-swiper-zoom")||b.maxRatio,g.currentScale=w.$imageWrapEl.attr("data-swiper-zoom")||b.maxRatio,e?(f=w.$slideEl[0].offsetWidth,m=w.$slideEl[0].offsetHeight,s=w.$slideEl.offset().left+f/2-t,a=w.$slideEl.offset().top+m/2-i,o=w.$imageEl[0].offsetWidth,l=w.$imageEl[0].offsetHeight,d=o*g.scale,h=l*g.scale,u=-(p=Math.min(f/2-d/2,0)),v=-(c=Math.min(m/2-h/2,0)),(r=s*g.scale)u&&(r=u),(n=a*g.scale)v&&(n=v)):(r=0,n=0),w.$imageWrapEl.transition(300).transform("translate3d("+r+"px, "+n+"px,0)"),w.$imageEl.transition(300).transform("translate3d(0,0,0) scale("+g.scale+")"))},out:function(){var e=this.zoom,t=this.params.zoom,i=e.gesture;i.$slideEl||(i.$slideEl=this.slides.eq(this.activeIndex),i.$imageEl=i.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),i.$imageWrapEl=i.$imageEl.parent("."+t.containerClass)),i.$imageEl&&0!==i.$imageEl.length&&(e.scale=1,e.currentScale=1,i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),i.$slideEl.removeClass(""+t.zoomedSlideClass),i.$slideEl=void 0)},enable:function(){var e=this.zoom;if(!e.enabled){e.enabled=!0;var t=!("touchstart"!==this.touchEvents.start||!o.passiveListener||!this.params.passiveListeners)&&{passive:!0,capture:!1},i=!o.passiveListener||{passive:!1,capture:!0},s="."+this.params.slideClass;o.gestures?(this.$wrapperEl.on("gesturestart",s,e.onGestureStart,t),this.$wrapperEl.on("gesturechange",s,e.onGestureChange,t),this.$wrapperEl.on("gestureend",s,e.onGestureEnd,t)):"touchstart"===this.touchEvents.start&&(this.$wrapperEl.on(this.touchEvents.start,s,e.onGestureStart,t),this.$wrapperEl.on(this.touchEvents.move,s,e.onGestureChange,i),this.$wrapperEl.on(this.touchEvents.end,s,e.onGestureEnd,t),this.touchEvents.cancel&&this.$wrapperEl.on(this.touchEvents.cancel,s,e.onGestureEnd,t)),this.$wrapperEl.on(this.touchEvents.move,"."+this.params.zoom.containerClass,e.onTouchMove,i)}},disable:function(){var e=this.zoom;if(e.enabled){this.zoom.enabled=!1;var t=!("touchstart"!==this.touchEvents.start||!o.passiveListener||!this.params.passiveListeners)&&{passive:!0,capture:!1},i=!o.passiveListener||{passive:!1,capture:!0},s="."+this.params.slideClass;o.gestures?(this.$wrapperEl.off("gesturestart",s,e.onGestureStart,t),this.$wrapperEl.off("gesturechange",s,e.onGestureChange,t),this.$wrapperEl.off("gestureend",s,e.onGestureEnd,t)):"touchstart"===this.touchEvents.start&&(this.$wrapperEl.off(this.touchEvents.start,s,e.onGestureStart,t),this.$wrapperEl.off(this.touchEvents.move,s,e.onGestureChange,i),this.$wrapperEl.off(this.touchEvents.end,s,e.onGestureEnd,t),this.touchEvents.cancel&&this.$wrapperEl.off(this.touchEvents.cancel,s,e.onGestureEnd,t)),this.$wrapperEl.off(this.touchEvents.move,"."+this.params.zoom.containerClass,e.onTouchMove,i)}}},le={loadInSlide:function(e,t){void 0===t&&(t=!0);var i=this,a=i.params.lazy;if(void 0!==e&&0!==i.slides.length){var r=i.virtual&&i.params.virtual.enabled?i.$wrapperEl.children("."+i.params.slideClass+'[data-swiper-slide-index="'+e+'"]'):i.slides.eq(e),n=r.find("."+a.elementClass+":not(."+a.loadedClass+"):not(."+a.loadingClass+")");!r.hasClass(a.elementClass)||r.hasClass(a.loadedClass)||r.hasClass(a.loadingClass)||(n=n.add(r[0])),0!==n.length&&n.each((function(e,n){var o=s(n);o.addClass(a.loadingClass);var l=o.attr("data-background"),d=o.attr("data-src"),h=o.attr("data-srcset"),p=o.attr("data-sizes");i.loadImage(o[0],d||l,h,p,!1,(function(){if(null!=i&&i&&(!i||i.params)&&!i.destroyed){if(l?(o.css("background-image",'url("'+l+'")'),o.removeAttr("data-background")):(h&&(o.attr("srcset",h),o.removeAttr("data-srcset")),p&&(o.attr("sizes",p),o.removeAttr("data-sizes")),d&&(o.attr("src",d),o.removeAttr("data-src"))),o.addClass(a.loadedClass).removeClass(a.loadingClass),r.find("."+a.preloaderClass).remove(),i.params.loop&&t){var e=r.attr("data-swiper-slide-index");if(r.hasClass(i.params.slideDuplicateClass)){var s=i.$wrapperEl.children('[data-swiper-slide-index="'+e+'"]:not(.'+i.params.slideDuplicateClass+")");i.lazy.loadInSlide(s.index(),!1)}else{var n=i.$wrapperEl.children("."+i.params.slideDuplicateClass+'[data-swiper-slide-index="'+e+'"]');i.lazy.loadInSlide(n.index(),!1)}}i.emit("lazyImageReady",r[0],o[0]),i.params.autoHeight&&i.updateAutoHeight()}})),i.emit("lazyImageLoad",r[0],o[0])}))}},load:function(){var e=this,t=e.$wrapperEl,i=e.params,a=e.slides,r=e.activeIndex,n=e.virtual&&i.virtual.enabled,o=i.lazy,l=i.slidesPerView;function d(e){if(n){if(t.children("."+i.slideClass+'[data-swiper-slide-index="'+e+'"]').length)return!0}else if(a[e])return!0;return!1}function h(e){return n?s(e).attr("data-swiper-slide-index"):s(e).index()}if("auto"===l&&(l=0),e.lazy.initialImageLoaded||(e.lazy.initialImageLoaded=!0),e.params.watchSlidesVisibility)t.children("."+i.slideVisibleClass).each((function(t,i){var a=n?s(i).attr("data-swiper-slide-index"):s(i).index();e.lazy.loadInSlide(a)}));else if(l>1)for(var p=r;p1||o.loadPrevNextAmount&&o.loadPrevNextAmount>1){for(var c=o.loadPrevNextAmount,u=l,v=Math.min(r+u+Math.max(c,u),a.length),f=Math.max(r-Math.max(u,c),0),m=r+l;m0&&e.lazy.loadInSlide(h(b));var w=t.children("."+i.slidePrevClass);w.length>0&&e.lazy.loadInSlide(h(w))}}},de={LinearSpline:function(e,t){var i,s,a,r,n,o=function(e,t){for(s=-1,i=e.length;i-s>1;)e[a=i+s>>1]<=t?s=a:i=a;return i};return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(n=o(this.x,e),r=n-1,(e-this.x[r])*(this.y[n]-this.y[r])/(this.x[n]-this.x[r])+this.y[r]):0},this},getInterpolateFunction:function(e){this.controller.spline||(this.controller.spline=this.params.loop?new de.LinearSpline(this.slidesGrid,e.slidesGrid):new de.LinearSpline(this.snapGrid,e.snapGrid))},setTranslate:function(e,t){var i,s,a=this,r=a.controller.control;function n(e){var t=a.rtlTranslate?-a.translate:a.translate;"slide"===a.params.controller.by&&(a.controller.getInterpolateFunction(e),s=-a.controller.spline.interpolate(-t)),s&&"container"!==a.params.controller.by||(i=(e.maxTranslate()-e.minTranslate())/(a.maxTranslate()-a.minTranslate()),s=(t-a.minTranslate())*i+e.minTranslate()),a.params.controller.inverse&&(s=e.maxTranslate()-s),e.updateProgress(s),e.setTranslate(s,a),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(r))for(var o=0;o0&&(this.isBeginning?this.a11y.disableEl(i):this.a11y.enableEl(i)),t&&t.length>0&&(this.isEnd?this.a11y.disableEl(t):this.a11y.enableEl(t))}},updatePagination:function(){var e=this,t=e.params.a11y;e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.bullets.each((function(i,a){var r=s(a);e.a11y.makeElFocusable(r),e.a11y.addElRole(r,"button"),e.a11y.addElLabel(r,t.paginationBulletMessage.replace(/{{index}}/,r.index()+1))}))},init:function(){this.$el.append(this.a11y.liveRegion);var e,t,i=this.params.a11y;this.navigation&&this.navigation.$nextEl&&(e=this.navigation.$nextEl),this.navigation&&this.navigation.$prevEl&&(t=this.navigation.$prevEl),e&&(this.a11y.makeElFocusable(e),this.a11y.addElRole(e,"button"),this.a11y.addElLabel(e,i.nextSlideMessage),e.on("keydown",this.a11y.onEnterKey)),t&&(this.a11y.makeElFocusable(t),this.a11y.addElRole(t,"button"),this.a11y.addElLabel(t,i.prevSlideMessage),t.on("keydown",this.a11y.onEnterKey)),this.pagination&&this.params.pagination.clickable&&this.pagination.bullets&&this.pagination.bullets.length&&this.pagination.$el.on("keydown","."+this.params.pagination.bulletClass,this.a11y.onEnterKey)},destroy:function(){var e,t;this.a11y.liveRegion&&this.a11y.liveRegion.length>0&&this.a11y.liveRegion.remove(),this.navigation&&this.navigation.$nextEl&&(e=this.navigation.$nextEl),this.navigation&&this.navigation.$prevEl&&(t=this.navigation.$prevEl),e&&e.off("keydown",this.a11y.onEnterKey),t&&t.off("keydown",this.a11y.onEnterKey),this.pagination&&this.params.pagination.clickable&&this.pagination.bullets&&this.pagination.bullets.length&&this.pagination.$el.off("keydown","."+this.params.pagination.bulletClass,this.a11y.onEnterKey)}},pe={init:function(){if(this.params.history){if(!t.history||!t.history.pushState)return this.params.history.enabled=!1,void(this.params.hashNavigation.enabled=!0);var e=this.history;e.initialized=!0,e.paths=pe.getPathValues(),(e.paths.key||e.paths.value)&&(e.scrollToSlide(0,e.paths.value,this.params.runCallbacksOnInit),this.params.history.replaceState||t.addEventListener("popstate",this.history.setHistoryPopState))}},destroy:function(){this.params.history.replaceState||t.removeEventListener("popstate",this.history.setHistoryPopState)},setHistoryPopState:function(){this.history.paths=pe.getPathValues(),this.history.scrollToSlide(this.params.speed,this.history.paths.value,!1)},getPathValues:function(){var e=t.location.pathname.slice(1).split("/").filter((function(e){return""!==e})),i=e.length;return{key:e[i-2],value:e[i-1]}},setHistory:function(e,i){if(this.history.initialized&&this.params.history.enabled){var s=this.slides.eq(i),a=pe.slugify(s.attr("data-history"));t.location.pathname.includes(e)||(a=e+"/"+a);var r=t.history.state;r&&r.value===a||(this.params.history.replaceState?t.history.replaceState({value:a},null,a):t.history.pushState({value:a},null,a))}},slugify:function(e){return e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,"")},scrollToSlide:function(e,t,i){if(t)for(var s=0,a=this.slides.length;s'),i.append(e)),e.css({height:r+"px"})):0===(e=t.find(".swiper-cube-shadow")).length&&(e=s('
'),t.append(e)));for(var u=0;u-1&&(c=90*f+90*b,o&&(c=90*-f-90*b)),v.transform(T),d.slideShadows){var E=h?v.find(".swiper-slide-shadow-left"):v.find(".swiper-slide-shadow-top"),S=h?v.find(".swiper-slide-shadow-right"):v.find(".swiper-slide-shadow-bottom");0===E.length&&(E=s('
'),v.append(E)),0===S.length&&(S=s('
'),v.append(S)),E.length&&(E[0].style.opacity=Math.max(-b,0)),S.length&&(S[0].style.opacity=Math.max(b,0))}}if(i.css({"-webkit-transform-origin":"50% 50% -"+l/2+"px","-moz-transform-origin":"50% 50% -"+l/2+"px","-ms-transform-origin":"50% 50% -"+l/2+"px","transform-origin":"50% 50% -"+l/2+"px"}),d.shadow)if(h)e.transform("translate3d(0px, "+(r/2+d.shadowOffset)+"px, "+-r/2+"px) rotateX(90deg) rotateZ(0deg) scale("+d.shadowScale+")");else{var C=Math.abs(c)-90*Math.floor(Math.abs(c)/90),M=1.5-(Math.sin(2*C*Math.PI/360)/2+Math.cos(2*C*Math.PI/360)/2),P=d.shadowScale,z=d.shadowScale/M,k=d.shadowOffset;e.transform("scale3d("+P+", 1, "+z+") translate3d(0px, "+(n/2+k)+"px, "+-n/2/z+"px) rotateX(-90deg)")}var $=j.isSafari||j.isUiWebView?-l/2:0;i.transform("translate3d(0px,0,"+$+"px) rotateX("+(this.isHorizontal()?0:c)+"deg) rotateY("+(this.isHorizontal()?-c:0)+"deg)")},setTransition:function(e){var t=this.$el;this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),this.params.cubeEffect.shadow&&!this.isHorizontal()&&t.find(".swiper-cube-shadow").transition(e)}},me={setTranslate:function(){for(var e=this.slides,t=this.rtlTranslate,i=0;i'),a.append(h)),0===p.length&&(p=s('
'),a.append(p)),h.length&&(h[0].style.opacity=Math.max(-r,0)),p.length&&(p[0].style.opacity=Math.max(r,0))}a.transform("translate3d("+l+"px, "+d+"px, 0px) rotateX("+o+"deg) rotateY("+n+"deg)")}},setTransition:function(e){var t=this,i=t.slides,s=t.activeIndex,a=t.$wrapperEl;if(i.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.virtualTranslate&&0!==e){var r=!1;i.eq(s).transitionEnd((function(){if(!r&&t&&!t.destroyed){r=!0,t.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],i=0;i'),f.append(C)),0===M.length&&(M=s('
'),f.append(M)),C.length&&(C[0].style.opacity=g>0?g:0),M.length&&(M[0].style.opacity=-g>0?-g:0)}}(o.pointerEvents||o.prefixedPointerEvents)&&(a[0].style.perspectiveOrigin=h+"px 50%")},setTransition:function(e){this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)}},be={init:function(){var e=this.params.thumbs,t=this.constructor;e.swiper instanceof t?(this.thumbs.swiper=e.swiper,n.extend(this.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),n.extend(this.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1})):n.isObject(e.swiper)&&(this.thumbs.swiper=new t(n.extend({},e.swiper,{watchSlidesVisibility:!0,watchSlidesProgress:!0,slideToClickedSlide:!1})),this.thumbs.swiperCreated=!0),this.thumbs.swiper.$el.addClass(this.params.thumbs.thumbsContainerClass),this.thumbs.swiper.on("tap",this.thumbs.onThumbClick)},onThumbClick:function(){var e=this.thumbs.swiper;if(e){var t=e.clickedIndex,i=e.clickedSlide;if(!(i&&s(i).hasClass(this.params.thumbs.slideThumbActiveClass)||null==t)){var a;if(a=e.params.loop?parseInt(s(e.clickedSlide).attr("data-swiper-slide-index"),10):t,this.params.loop){var r=this.activeIndex;this.slides.eq(r).hasClass(this.params.slideDuplicateClass)&&(this.loopFix(),this._clientLeft=this.$wrapperEl[0].clientLeft,r=this.activeIndex);var n=this.slides.eq(r).prevAll('[data-swiper-slide-index="'+a+'"]').eq(0).index(),o=this.slides.eq(r).nextAll('[data-swiper-slide-index="'+a+'"]').eq(0).index();a=void 0===n?o:void 0===o?n:o-ra?s-Math.floor(i/2)+1:s+Math.floor(i/2)-1:s>a&&(s=s-i+1),t.slideTo(s,e?0:void 0))}var o=1,l=this.params.thumbs.slideThumbActiveClass;if(this.params.slidesPerView>1&&!this.params.centeredSlides&&(o=this.params.slidesPerView),this.params.thumbs.multipleActiveThumbs||(o=1),o=Math.floor(o),t.slides.removeClass(l),t.params.loop||t.params.virtual&&t.params.virtual.enabled)for(var d=0;d0&&!s(e.target).hasClass(this.params.pagination.bulletClass)&&(!0===this.pagination.$el.hasClass(this.params.pagination.hiddenClass)?this.emit("paginationShow",this):this.emit("paginationHide",this),this.pagination.$el.toggleClass(this.params.pagination.hiddenClass))}}},{name:"scrollbar",params:{scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}},create:function(){n.extend(this,{scrollbar:{init:re.init.bind(this),destroy:re.destroy.bind(this),updateSize:re.updateSize.bind(this),setTranslate:re.setTranslate.bind(this),setTransition:re.setTransition.bind(this),enableDraggable:re.enableDraggable.bind(this),disableDraggable:re.disableDraggable.bind(this),setDragPosition:re.setDragPosition.bind(this),getPointerPosition:re.getPointerPosition.bind(this),onDragStart:re.onDragStart.bind(this),onDragMove:re.onDragMove.bind(this),onDragEnd:re.onDragEnd.bind(this),isTouched:!1,timeout:null,dragTimeout:null}})},on:{init:function(){this.scrollbar.init(),this.scrollbar.updateSize(),this.scrollbar.setTranslate()},update:function(){this.scrollbar.updateSize()},resize:function(){this.scrollbar.updateSize()},observerUpdate:function(){this.scrollbar.updateSize()},setTranslate:function(){this.scrollbar.setTranslate()},setTransition:function(e){this.scrollbar.setTransition(e)},destroy:function(){this.scrollbar.destroy()}}},{name:"parallax",params:{parallax:{enabled:!1}},create:function(){n.extend(this,{parallax:{setTransform:ne.setTransform.bind(this),setTranslate:ne.setTranslate.bind(this),setTransition:ne.setTransition.bind(this)}})},on:{beforeInit:function(){this.params.parallax.enabled&&(this.params.watchSlidesProgress=!0,this.originalParams.watchSlidesProgress=!0)},init:function(){this.params.parallax.enabled&&this.parallax.setTranslate()},setTranslate:function(){this.params.parallax.enabled&&this.parallax.setTranslate()},setTransition:function(e){this.params.parallax.enabled&&this.parallax.setTransition(e)}}},{name:"zoom",params:{zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}},create:function(){var e=this,t={enabled:!1,scale:1,currentScale:1,isScaling:!1,gesture:{$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},image:{isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},velocity:{x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0}};"onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out".split(" ").forEach((function(i){t[i]=oe[i].bind(e)})),n.extend(e,{zoom:t});var i=1;Object.defineProperty(e.zoom,"scale",{get:function(){return i},set:function(t){if(i!==t){var s=e.zoom.gesture.$imageEl?e.zoom.gesture.$imageEl[0]:void 0,a=e.zoom.gesture.$slideEl?e.zoom.gesture.$slideEl[0]:void 0;e.emit("zoomChange",t,s,a)}i=t}})},on:{init:function(){this.params.zoom.enabled&&this.zoom.enable()},destroy:function(){this.zoom.disable()},touchStart:function(e){this.zoom.enabled&&this.zoom.onTouchStart(e)},touchEnd:function(e){this.zoom.enabled&&this.zoom.onTouchEnd(e)},doubleTap:function(e){this.params.zoom.enabled&&this.zoom.enabled&&this.params.zoom.toggle&&this.zoom.toggle(e)},transitionEnd:function(){this.zoom.enabled&&this.params.zoom.enabled&&this.zoom.onTransitionEnd()},slideChange:function(){this.zoom.enabled&&this.params.zoom.enabled&&this.params.cssMode&&this.zoom.onTransitionEnd()}}},{name:"lazy",params:{lazy:{enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}},create:function(){n.extend(this,{lazy:{initialImageLoaded:!1,load:le.load.bind(this),loadInSlide:le.loadInSlide.bind(this)}})},on:{beforeInit:function(){this.params.lazy.enabled&&this.params.preloadImages&&(this.params.preloadImages=!1)},init:function(){this.params.lazy.enabled&&!this.params.loop&&0===this.params.initialSlide&&this.lazy.load()},scroll:function(){this.params.freeMode&&!this.params.freeModeSticky&&this.lazy.load()},resize:function(){this.params.lazy.enabled&&this.lazy.load()},scrollbarDragMove:function(){this.params.lazy.enabled&&this.lazy.load()},transitionStart:function(){this.params.lazy.enabled&&(this.params.lazy.loadOnTransitionStart||!this.params.lazy.loadOnTransitionStart&&!this.lazy.initialImageLoaded)&&this.lazy.load()},transitionEnd:function(){this.params.lazy.enabled&&!this.params.lazy.loadOnTransitionStart&&this.lazy.load()},slideChange:function(){this.params.lazy.enabled&&this.params.cssMode&&this.lazy.load()}}},{name:"controller",params:{controller:{control:void 0,inverse:!1,by:"slide"}},create:function(){n.extend(this,{controller:{control:this.params.controller.control,getInterpolateFunction:de.getInterpolateFunction.bind(this),setTranslate:de.setTranslate.bind(this),setTransition:de.setTransition.bind(this)}})},on:{update:function(){this.controller.control&&this.controller.spline&&(this.controller.spline=void 0,delete this.controller.spline)},resize:function(){this.controller.control&&this.controller.spline&&(this.controller.spline=void 0,delete this.controller.spline)},observerUpdate:function(){this.controller.control&&this.controller.spline&&(this.controller.spline=void 0,delete this.controller.spline)},setTranslate:function(e,t){this.controller.control&&this.controller.setTranslate(e,t)},setTransition:function(e,t){this.controller.control&&this.controller.setTransition(e,t)}}},{name:"a11y",params:{a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}"}},create:function(){var e=this;n.extend(e,{a11y:{liveRegion:s('')}}),Object.keys(he).forEach((function(t){e.a11y[t]=he[t].bind(e)}))},on:{init:function(){this.params.a11y.enabled&&(this.a11y.init(),this.a11y.updateNavigation())},toEdge:function(){this.params.a11y.enabled&&this.a11y.updateNavigation()},fromEdge:function(){this.params.a11y.enabled&&this.a11y.updateNavigation()},paginationUpdate:function(){this.params.a11y.enabled&&this.a11y.updatePagination()},destroy:function(){this.params.a11y.enabled&&this.a11y.destroy()}}},{name:"history",params:{history:{enabled:!1,replaceState:!1,key:"slides"}},create:function(){n.extend(this,{history:{init:pe.init.bind(this),setHistory:pe.setHistory.bind(this),setHistoryPopState:pe.setHistoryPopState.bind(this),scrollToSlide:pe.scrollToSlide.bind(this),destroy:pe.destroy.bind(this)}})},on:{init:function(){this.params.history.enabled&&this.history.init()},destroy:function(){this.params.history.enabled&&this.history.destroy()},transitionEnd:function(){this.history.initialized&&this.history.setHistory(this.params.history.key,this.activeIndex)},slideChange:function(){this.history.initialized&&this.params.cssMode&&this.history.setHistory(this.params.history.key,this.activeIndex)}}},{name:"hash-navigation",params:{hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}},create:function(){n.extend(this,{hashNavigation:{initialized:!1,init:ce.init.bind(this),destroy:ce.destroy.bind(this),setHash:ce.setHash.bind(this),onHashCange:ce.onHashCange.bind(this)}})},on:{init:function(){this.params.hashNavigation.enabled&&this.hashNavigation.init()},destroy:function(){this.params.hashNavigation.enabled&&this.hashNavigation.destroy()},transitionEnd:function(){this.hashNavigation.initialized&&this.hashNavigation.setHash()},slideChange:function(){this.hashNavigation.initialized&&this.params.cssMode&&this.hashNavigation.setHash()}}},{name:"autoplay",params:{autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1}},create:function(){var e=this;n.extend(e,{autoplay:{running:!1,paused:!1,run:ue.run.bind(e),start:ue.start.bind(e),stop:ue.stop.bind(e),pause:ue.pause.bind(e),onVisibilityChange:function(){"hidden"===document.visibilityState&&e.autoplay.running&&e.autoplay.pause(),"visible"===document.visibilityState&&e.autoplay.paused&&(e.autoplay.run(),e.autoplay.paused=!1)},onTransitionEnd:function(t){e&&!e.destroyed&&e.$wrapperEl&&t.target===this&&(e.$wrapperEl[0].removeEventListener("transitionend",e.autoplay.onTransitionEnd),e.$wrapperEl[0].removeEventListener("webkitTransitionEnd",e.autoplay.onTransitionEnd),e.autoplay.paused=!1,e.autoplay.running?e.autoplay.run():e.autoplay.stop())}}})},on:{init:function(){this.params.autoplay.enabled&&(this.autoplay.start(),document.addEventListener("visibilitychange",this.autoplay.onVisibilityChange))},beforeTransitionStart:function(e,t){this.autoplay.running&&(t||!this.params.autoplay.disableOnInteraction?this.autoplay.pause(e):this.autoplay.stop())},sliderFirstMove:function(){this.autoplay.running&&(this.params.autoplay.disableOnInteraction?this.autoplay.stop():this.autoplay.pause())},touchEnd:function(){this.params.cssMode&&this.autoplay.paused&&!this.params.autoplay.disableOnInteraction&&this.autoplay.run()},destroy:function(){this.autoplay.running&&this.autoplay.stop(),document.removeEventListener("visibilitychange",this.autoplay.onVisibilityChange)}}},{name:"effect-fade",params:{fadeEffect:{crossFade:!1}},create:function(){n.extend(this,{fadeEffect:{setTranslate:ve.setTranslate.bind(this),setTransition:ve.setTransition.bind(this)}})},on:{beforeInit:function(){if("fade"===this.params.effect){this.classNames.push(this.params.containerModifierClass+"fade");var e={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};n.extend(this.params,e),n.extend(this.originalParams,e)}},setTranslate:function(){"fade"===this.params.effect&&this.fadeEffect.setTranslate()},setTransition:function(e){"fade"===this.params.effect&&this.fadeEffect.setTransition(e)}}},{name:"effect-cube",params:{cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}},create:function(){n.extend(this,{cubeEffect:{setTranslate:fe.setTranslate.bind(this),setTransition:fe.setTransition.bind(this)}})},on:{beforeInit:function(){if("cube"===this.params.effect){this.classNames.push(this.params.containerModifierClass+"cube"),this.classNames.push(this.params.containerModifierClass+"3d");var e={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0};n.extend(this.params,e),n.extend(this.originalParams,e)}},setTranslate:function(){"cube"===this.params.effect&&this.cubeEffect.setTranslate()},setTransition:function(e){"cube"===this.params.effect&&this.cubeEffect.setTransition(e)}}},{name:"effect-flip",params:{flipEffect:{slideShadows:!0,limitRotation:!0}},create:function(){n.extend(this,{flipEffect:{setTranslate:me.setTranslate.bind(this),setTransition:me.setTransition.bind(this)}})},on:{beforeInit:function(){if("flip"===this.params.effect){this.classNames.push(this.params.containerModifierClass+"flip"),this.classNames.push(this.params.containerModifierClass+"3d");var e={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};n.extend(this.params,e),n.extend(this.originalParams,e)}},setTranslate:function(){"flip"===this.params.effect&&this.flipEffect.setTranslate()},setTransition:function(e){"flip"===this.params.effect&&this.flipEffect.setTransition(e)}}},{name:"effect-coverflow",params:{coverflowEffect:{rotate:50,stretch:0,depth:100,modifier:1,slideShadows:!0}},create:function(){n.extend(this,{coverflowEffect:{setTranslate:ge.setTranslate.bind(this),setTransition:ge.setTransition.bind(this)}})},on:{beforeInit:function(){"coverflow"===this.params.effect&&(this.classNames.push(this.params.containerModifierClass+"coverflow"),this.classNames.push(this.params.containerModifierClass+"3d"),this.params.watchSlidesProgress=!0,this.originalParams.watchSlidesProgress=!0)},setTranslate:function(){"coverflow"===this.params.effect&&this.coverflowEffect.setTranslate()},setTransition:function(e){"coverflow"===this.params.effect&&this.coverflowEffect.setTransition(e)}}},{name:"thumbs",params:{thumbs:{multipleActiveThumbs:!0,swiper:null,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-container-thumbs"}},create:function(){n.extend(this,{thumbs:{swiper:null,init:be.init.bind(this),update:be.update.bind(this),onThumbClick:be.onThumbClick.bind(this)}})},on:{beforeInit:function(){var e=this.params.thumbs;e&&e.swiper&&(this.thumbs.init(),this.thumbs.update(!0))},slideChange:function(){this.thumbs.swiper&&this.thumbs.update()},update:function(){this.thumbs.swiper&&this.thumbs.update()},resize:function(){this.thumbs.swiper&&this.thumbs.update()},observerUpdate:function(){this.thumbs.swiper&&this.thumbs.update()},setTransition:function(e){var t=this.thumbs.swiper;t&&t.setTransition(e)},beforeDestroy:function(){var e=this.thumbs.swiper;e&&this.thumbs.swiperCreated&&e&&e.destroy()}}}];return void 0===W.use&&(W.use=W.Class.use,W.installModule=W.Class.installModule),W.use(we),W})); +//# sourceMappingURL=swiper.min.js.map \ No newline at end of file diff --git a/public/js/vendor.js b/public/js/vendor.js new file mode 100644 index 0000000..8e1ac24 --- /dev/null +++ b/public/js/vendor.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[898],{306:(e,t,n)=>{n.d(t,{Z:()=>Cn});var r,i,o,a,s=!1,l=!1,c=[];function u(e){!function(e){c.includes(e)||c.push(e);l||s||(s=!0,queueMicrotask(d))}(e)}function f(e){let t=c.indexOf(e);-1!==t&&c.splice(t,1)}function d(){s=!1,l=!0;for(let e=0;e{(void 0===t||t.includes(n))&&(r.forEach((e=>e())),delete e._x_attributeCleanups[n])}))}var y=new MutationObserver($),b=!1;function w(){y.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),b=!0}function E(){(k=k.concat(y.takeRecords())).length&&!A&&(A=!0,queueMicrotask((()=>{$(k),k.length=0,A=!1}))),y.disconnect(),b=!1}var k=[],A=!1;function O(e){if(!b)return e();E();let t=e();return w(),t}var S=!1,C=[];function $(e){if(S)return void(C=C.concat(e));let t=[],n=[],r=new Map,i=new Map;for(let o=0;o1===e.nodeType&&t.push(e))),e[o].removedNodes.forEach((e=>1===e.nodeType&&n.push(e)))),"attributes"===e[o].type)){let t=e[o].target,n=e[o].attributeName,a=e[o].oldValue,s=()=>{r.has(t)||r.set(t,[]),r.get(t).push({name:n,value:t.getAttribute(n)})},l=()=>{i.has(t)||i.set(t,[]),i.get(t).push(n)};t.hasAttribute(n)&&null===a?s():t.hasAttribute(n)?(l(),s()):l()}i.forEach(((e,t)=>{v(t,e)})),r.forEach(((e,t)=>{h.forEach((n=>n(t,e)))}));for(let e of n)if(!t.includes(e)&&(m.forEach((t=>t(e))),e._x_cleanups))for(;e._x_cleanups.length;)e._x_cleanups.pop()();t.forEach((e=>{e._x_ignoreSelf=!0,e._x_ignore=!0}));for(let e of t)n.includes(e)||e.isConnected&&(delete e._x_ignoreSelf,delete e._x_ignore,x.forEach((t=>t(e))),e._x_ignore=!0,e._x_ignoreSelf=!0);t.forEach((e=>{delete e._x_ignoreSelf,delete e._x_ignore})),t=null,n=null,r=null,i=null}function j(e){return P(N(e))}function M(e,t,n){return e._x_dataStack=[t,...N(n||e)],()=>{e._x_dataStack=e._x_dataStack.filter((e=>e!==t))}}function L(e,t){let n=e._x_dataStack[0];Object.entries(t).forEach((([e,t])=>{n[e]=t}))}function N(e){return e._x_dataStack?e._x_dataStack:"function"==typeof ShadowRoot&&e instanceof ShadowRoot?N(e.host):e.parentNode?N(e.parentNode):[]}function P(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap((e=>Object.keys(e))))),has:(t,n)=>e.some((e=>e.hasOwnProperty(n))),get:(n,r)=>(e.find((e=>{if(e.hasOwnProperty(r)){let n=Object.getOwnPropertyDescriptor(e,r);if(n.get&&n.get._x_alreadyBound||n.set&&n.set._x_alreadyBound)return!0;if((n.get||n.set)&&n.enumerable){let i=n.get,o=n.set,a=n;i=i&&i.bind(t),o=o&&o.bind(t),i&&(i._x_alreadyBound=!0),o&&(o._x_alreadyBound=!0),Object.defineProperty(e,r,{...a,get:i,set:o})}return!0}return!1}))||{})[r],set:(t,n,r)=>{let i=e.find((e=>e.hasOwnProperty(n)));return i?i[n]=r:e[e.length-1][n]=r,!0}});return t}function R(e){let t=(n,r="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach((([i,{value:o,enumerable:a}])=>{if(!1===a||void 0===o)return;let s=""===r?i:`${r}.${i}`;var l;"object"==typeof o&&null!==o&&o._x_interceptor?n[i]=o.initialize(e,s,i):"object"!=typeof(l=o)||Array.isArray(l)||null===l||o===n||o instanceof Element||t(o,s)}))};return t(e)}function T(e,t=(()=>{})){let n={initialValue:void 0,_x_interceptor:!0,initialize(t,n,r){return e(this.initialValue,(()=>function(e,t){return t.split(".").reduce(((e,t)=>e[t]),e)}(t,n)),(e=>z(t,n,e)),n,r)}};return t(n),e=>{if("object"==typeof e&&null!==e&&e._x_interceptor){let t=n.initialize.bind(n);n.initialize=(r,i,o)=>{let a=e.initialize(r,i,o);return n.initialValue=a,t(r,i,o)}}else n.initialValue=e;return n}}function z(e,t,n){if("string"==typeof t&&(t=t.split(".")),1!==t.length){if(0===t.length)throw error;return e[t[0]]||(e[t[0]]={}),z(e[t[0]],t.slice(1),n)}e[t[0]]=n}var I={};function D(e,t){I[e]=t}function q(e,t){return Object.entries(I).forEach((([n,r])=>{Object.defineProperty(e,`$${n}`,{get(){let[e,n]=oe(t);return e={interceptor:T,...e},g(t,n),r(t,e)},enumerable:!1})})),e}function W(e,t,n,...r){try{return n(...r)}catch(n){B(n,e,t)}}function B(e,t,n){Object.assign(e,{el:t,expression:n}),console.warn(`Alpine Expression Error: ${e.message}\n\n${n?'Expression: "'+n+'"\n\n':""}`,t),setTimeout((()=>{throw e}),0)}var F=!0;function V(e,t,n={}){let r;return K(e,t)((e=>r=e),n),r}function K(...e){return U(...e)}var U=H;function H(e,t){let n={};q(n,e);let r=[n,...N(e)];if("function"==typeof t)return function(e,t){return(n=(()=>{}),{scope:r={},params:i=[]}={})=>{Y(n,t.apply(P([r,...e]),i))}}(r,t);let i=function(e,t,n){let r=function(e,t){if(Z[e])return Z[e];let n=Object.getPrototypeOf((async function(){})).constructor,r=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(() => { ${e} })()`:e;let i=(()=>{try{return new n(["__self","scope"],`with (scope) { __self.result = ${r} }; __self.finished = true; return __self.result;`)}catch(n){return B(n,t,e),Promise.resolve()}})();return Z[e]=i,i}(t,n);return(i=(()=>{}),{scope:o={},params:a=[]}={})=>{r.result=void 0,r.finished=!1;let s=P([o,...e]);if("function"==typeof r){let e=r(r,s).catch((e=>B(e,n,t)));r.finished?(Y(i,r.result,s,a,n),r.result=void 0):e.then((e=>{Y(i,e,s,a,n)})).catch((e=>B(e,n,t))).finally((()=>r.result=void 0))}}}(r,t,e);return W.bind(null,e,t,i)}var Z={};function Y(e,t,n,r,i){if(F&&"function"==typeof t){let o=t.apply(n,r);o instanceof Promise?o.then((t=>Y(e,t,n,r))).catch((e=>B(e,i,t))):e(o)}else e(t)}var J="x-";function G(e=""){return J+e}var Q={};function X(e,t){Q[e]=t}function ee(e,t,n){if(t=Array.from(t),e._x_virtualDirectives){let n=Object.entries(e._x_virtualDirectives).map((([e,t])=>({name:e,value:t}))),r=te(n);n=n.map((e=>r.find((t=>t.name===e.name))?{name:`x-bind:${e.name}`,value:`"${e.value}"`}:e)),t=t.concat(n)}let r={},i=t.map(se(((e,t)=>r[e]=t))).filter(ue).map(function(e,t){return({name:n,value:r})=>{let i=n.match(fe()),o=n.match(/:([a-zA-Z0-9\-:]+)/),a=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],s=t||e[n]||n;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:a.map((e=>e.replace(".",""))),expression:r,original:s}}}(r,n)).sort(pe);return i.map((t=>function(e,t){let n=()=>{},r=Q[t.type]||n,[i,o]=oe(e);!function(e,t,n){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(n)}(e,t.original,o);let a=()=>{e._x_ignore||e._x_ignoreSelf||(r.inline&&r.inline(e,t,i),r=r.bind(r,e,t,i),ne?re.get(ie).push(r):r())};return a.runCleanups=o,a}(e,t)))}function te(e){return Array.from(e).map(se()).filter((e=>!ue(e)))}var ne=!1,re=new Map,ie=Symbol();function oe(e){let t=[],[n,r]=function(e){let t=()=>{};return[n=>{let r=i(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach((e=>e()))}),e._x_effects.add(r),t=()=>{void 0!==r&&(e._x_effects.delete(r),o(r))},r},()=>{t()}]}(e);t.push(r);return[{Alpine:Ge,effect:n,cleanup:e=>t.push(e),evaluateLater:K.bind(K,e),evaluate:V.bind(V,e)},()=>t.forEach((e=>e()))]}var ae=(e,t)=>({name:n,value:r})=>(n.startsWith(e)&&(n=n.replace(e,t)),{name:n,value:r});function se(e=(()=>{})){return({name:t,value:n})=>{let{name:r,value:i}=le.reduce(((e,t)=>t(e)),{name:t,value:n});return r!==t&&e(r,t),{name:r,value:i}}}var le=[];function ce(e){le.push(e)}function ue({name:e}){return fe().test(e)}var fe=()=>new RegExp(`^${J}([^:^.]+)\\b`);var de="DEFAULT",_e=["ignore","ref","data","id","radio","tabs","switch","disclosure","menu","listbox","list","item","combobox","bind","init","for","mask","model","modelable","transition","show","if",de,"teleport"];function pe(e,t){let n=-1===_e.indexOf(e.type)?de:e.type,r=-1===_e.indexOf(t.type)?de:t.type;return _e.indexOf(n)-_e.indexOf(r)}function he(e,t,n={}){e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0,composed:!0,cancelable:!0}))}var me=[],xe=!1;function ge(e=(()=>{})){return queueMicrotask((()=>{xe||setTimeout((()=>{ve()}))})),new Promise((t=>{me.push((()=>{e(),t()}))}))}function ve(){for(xe=!1;me.length;)me.shift()()}function ye(e,t){if("function"==typeof ShadowRoot&&e instanceof ShadowRoot)return void Array.from(e.children).forEach((e=>ye(e,t)));let n=!1;if(t(e,(()=>n=!0)),n)return;let r=e.firstElementChild;for(;r;)ye(r,t),r=r.nextElementSibling}function be(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var we=[],Ee=[];function ke(){return we.map((e=>e()))}function Ae(){return we.concat(Ee).map((e=>e()))}function Oe(e){we.push(e)}function Se(e){Ee.push(e)}function Ce(e,t=!1){return $e(e,(e=>{if((t?Ae():ke()).some((t=>e.matches(t))))return!0}))}function $e(e,t){if(e){if(t(e))return e;if(e._x_teleportBack&&(e=e._x_teleportBack),e.parentElement)return $e(e.parentElement,t)}}function je(e,t=ye){!function(e){ne=!0;let t=Symbol();ie=t,re.set(t,[]);let n=()=>{for(;re.get(t).length;)re.get(t).shift()();re.delete(t)};e(n),ne=!1,n()}((()=>{t(e,((e,t)=>{ee(e,e.attributes).forEach((e=>e())),e._x_ignore&&t()}))}))}function Me(e,t){return Array.isArray(t)?Le(e,t.join(" ")):"object"==typeof t&&null!==t?function(e,t){let n=e=>e.split(" ").filter(Boolean),r=Object.entries(t).flatMap((([e,t])=>!!t&&n(e))).filter(Boolean),i=Object.entries(t).flatMap((([e,t])=>!t&&n(e))).filter(Boolean),o=[],a=[];return i.forEach((t=>{e.classList.contains(t)&&(e.classList.remove(t),a.push(t))})),r.forEach((t=>{e.classList.contains(t)||(e.classList.add(t),o.push(t))})),()=>{a.forEach((t=>e.classList.add(t))),o.forEach((t=>e.classList.remove(t)))}}(e,t):"function"==typeof t?Me(e,t()):Le(e,t)}function Le(e,t){return t=!0===t?t="":t||"",n=t.split(" ").filter((t=>!e.classList.contains(t))).filter(Boolean),e.classList.add(...n),()=>{e.classList.remove(...n)};var n}function Ne(e,t){return"object"==typeof t&&null!==t?function(e,t){let n={};return Object.entries(t).forEach((([t,r])=>{n[t]=e.style[t],t.startsWith("--")||(t=t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()),e.style.setProperty(t,r)})),setTimeout((()=>{0===e.style.length&&e.removeAttribute("style")})),()=>{Ne(e,n)}}(e,t):function(e,t){let n=e.getAttribute("style",t);return e.setAttribute("style",t),()=>{e.setAttribute("style",n||"")}}(e,t)}function Pe(e,t=(()=>{})){let n=!1;return function(){n?t.apply(this,arguments):(n=!0,e.apply(this,arguments))}}function Re(e,t,n={}){e._x_transition||(e._x_transition={enter:{during:n,start:n,end:n},leave:{during:n,start:n,end:n},in(n=(()=>{}),r=(()=>{})){ze(e,t,{during:this.enter.during,start:this.enter.start,end:this.enter.end},n,r)},out(n=(()=>{}),r=(()=>{})){ze(e,t,{during:this.leave.during,start:this.leave.start,end:this.leave.end},n,r)}})}function Te(e){let t=e.parentNode;if(t)return t._x_hidePromise?t:Te(t)}function ze(e,t,{during:n,start:r,end:i}={},o=(()=>{}),a=(()=>{})){if(e._x_transitioning&&e._x_transitioning.cancel(),0===Object.keys(n).length&&0===Object.keys(r).length&&0===Object.keys(i).length)return o(),void a();let s,l,c;!function(e,t){let n,r,i,o=Pe((()=>{O((()=>{n=!0,r||t.before(),i||(t.end(),ve()),t.after(),e.isConnected&&t.cleanup(),delete e._x_transitioning}))}));e._x_transitioning={beforeCancels:[],beforeCancel(e){this.beforeCancels.push(e)},cancel:Pe((function(){for(;this.beforeCancels.length;)this.beforeCancels.shift()();o()})),finish:o},O((()=>{t.start(),t.during()})),xe=!0,requestAnimationFrame((()=>{if(n)return;let o=1e3*Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s","")),a=1e3*Number(getComputedStyle(e).transitionDelay.replace(/,.*/,"").replace("s",""));0===o&&(o=1e3*Number(getComputedStyle(e).animationDuration.replace("s",""))),O((()=>{t.before()})),r=!0,requestAnimationFrame((()=>{n||(O((()=>{t.end()})),ve(),setTimeout(e._x_transitioning.finish,o+a),i=!0)}))}))}(e,{start(){s=t(e,r)},during(){l=t(e,n)},before:o,end(){s(),c=t(e,i)},after:a,cleanup(){l(),c()}})}function Ie(e,t,n){if(-1===e.indexOf(t))return n;const r=e[e.indexOf(t)+1];if(!r)return n;if("scale"===t&&isNaN(r))return n;if("duration"===t){let e=r.match(/([0-9]+)ms/);if(e)return e[1]}return"origin"===t&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[r,e[e.indexOf(t)+2]].join(" "):r}X("transition",((e,{value:t,modifiers:n,expression:r},{evaluate:i})=>{"function"==typeof r&&(r=i(r)),r?function(e,t,n){Re(e,Me,""),{enter:t=>{e._x_transition.enter.during=t},"enter-start":t=>{e._x_transition.enter.start=t},"enter-end":t=>{e._x_transition.enter.end=t},leave:t=>{e._x_transition.leave.during=t},"leave-start":t=>{e._x_transition.leave.start=t},"leave-end":t=>{e._x_transition.leave.end=t}}[n](t)}(e,r,t):function(e,t,n){Re(e,Ne);let r=!t.includes("in")&&!t.includes("out")&&!n,i=r||t.includes("in")||["enter"].includes(n),o=r||t.includes("out")||["leave"].includes(n);t.includes("in")&&!r&&(t=t.filter(((e,n)=>nn>t.indexOf("out"))));let a=!t.includes("opacity")&&!t.includes("scale"),s=a||t.includes("opacity"),l=a||t.includes("scale"),c=s?0:1,u=l?Ie(t,"scale",95)/100:1,f=Ie(t,"delay",0),d=Ie(t,"origin","center"),_="opacity, transform",p=Ie(t,"duration",150)/1e3,h=Ie(t,"duration",75)/1e3,m="cubic-bezier(0.4, 0.0, 0.2, 1)";i&&(e._x_transition.enter.during={transformOrigin:d,transitionDelay:f,transitionProperty:_,transitionDuration:`${p}s`,transitionTimingFunction:m},e._x_transition.enter.start={opacity:c,transform:`scale(${u})`},e._x_transition.enter.end={opacity:1,transform:"scale(1)"});o&&(e._x_transition.leave.during={transformOrigin:d,transitionDelay:f,transitionProperty:_,transitionDuration:`${h}s`,transitionTimingFunction:m},e._x_transition.leave.start={opacity:1,transform:"scale(1)"},e._x_transition.leave.end={opacity:c,transform:`scale(${u})`})}(e,n,t)})),window.Element.prototype._x_toggleAndCascadeWithTransitions=function(e,t,n,r){const i="visible"===document.visibilityState?requestAnimationFrame:setTimeout;let o=()=>i(n);t?e._x_transition&&(e._x_transition.enter||e._x_transition.leave)?e._x_transition.enter&&(Object.entries(e._x_transition.enter.during).length||Object.entries(e._x_transition.enter.start).length||Object.entries(e._x_transition.enter.end).length)?e._x_transition.in(n):o():e._x_transition?e._x_transition.in(n):o():(e._x_hidePromise=e._x_transition?new Promise(((t,n)=>{e._x_transition.out((()=>{}),(()=>t(r))),e._x_transitioning.beforeCancel((()=>n({isFromCancelledTransition:!0})))})):Promise.resolve(r),queueMicrotask((()=>{let t=Te(e);t?(t._x_hideChildren||(t._x_hideChildren=[]),t._x_hideChildren.push(e)):i((()=>{let t=e=>{let n=Promise.all([e._x_hidePromise,...(e._x_hideChildren||[]).map(t)]).then((([e])=>e()));return delete e._x_hidePromise,delete e._x_hideChildren,n};t(e).catch((e=>{if(!e.isFromCancelledTransition)throw e}))}))})))};var De=!1;function qe(e,t=(()=>{})){return(...n)=>De?t(...n):e(...n)}function We(e,t,n,i=[]){switch(e._x_bindings||(e._x_bindings=r({})),e._x_bindings[t]=n,t=i.includes("camel")?t.toLowerCase().replace(/-(\w)/g,((e,t)=>t.toUpperCase())):t){case"value":!function(e,t){if("radio"===e.type)void 0===e.attributes.value&&(e.value=t),window.fromModel&&(e.checked=Be(e.value,t));else if("checkbox"===e.type)Number.isInteger(t)?e.value=t:Number.isInteger(t)||Array.isArray(t)||"boolean"==typeof t||[null,void 0].includes(t)?Array.isArray(t)?e.checked=t.some((t=>Be(t,e.value))):e.checked=!!t:e.value=String(t);else if("SELECT"===e.tagName)!function(e,t){const n=[].concat(t).map((e=>e+""));Array.from(e.options).forEach((e=>{e.selected=n.includes(e.value)}))}(e,t);else{if(e.value===t)return;e.value=t}}(e,n);break;case"style":!function(e,t){e._x_undoAddedStyles&&e._x_undoAddedStyles();e._x_undoAddedStyles=Ne(e,t)}(e,n);break;case"class":!function(e,t){e._x_undoAddedClasses&&e._x_undoAddedClasses();e._x_undoAddedClasses=Me(e,t)}(e,n);break;default:!function(e,t,n){[null,void 0,!1].includes(n)&&function(e){return!["aria-pressed","aria-checked","aria-expanded","aria-selected"].includes(e)}(t)?e.removeAttribute(t):(Fe(t)&&(n=t),function(e,t,n){e.getAttribute(t)!=n&&e.setAttribute(t,n)}(e,t,n))}(e,t,n)}}function Be(e,t){return e==t}function Fe(e){return["disabled","checked","required","readonly","hidden","open","selected","autofocus","itemscope","multiple","novalidate","allowfullscreen","allowpaymentrequest","formnovalidate","autoplay","controls","loop","muted","playsinline","default","ismap","reversed","async","defer","nomodule"].includes(e)}function Ve(e,t){var n;return function(){var r=this,i=arguments,o=function(){n=null,e.apply(r,i)};clearTimeout(n),n=setTimeout(o,t)}}function Ke(e,t){let n;return function(){let r=this,i=arguments;n||(e.apply(r,i),n=!0,setTimeout((()=>n=!1),t))}}var Ue={},He=!1;var Ze={};function Ye(e,t,n){let r=[];for(;r.length;)r.pop()();let i=Object.entries(t).map((([e,t])=>({name:e,value:t}))),o=te(i);i=i.map((e=>o.find((t=>t.name===e.name))?{name:`x-bind:${e.name}`,value:`"${e.value}"`}:e)),ee(e,i,n).map((e=>{r.push(e.runCleanups),e()}))}var Je={};var Ge={get reactive(){return r},get release(){return o},get effect(){return i},get raw(){return a},version:"3.10.5",flushAndStopDeferringMutations:function(){S=!1,$(C),C=[]},dontAutoEvaluateFunctions:function(e){let t=F;F=!1,e(),F=t},disableEffectScheduling:function(e){_=!1,e(),_=!0},setReactivityEngine:function(e){r=e.reactive,o=e.release,i=t=>e.effect(t,{scheduler:e=>{_?u(e):e()}}),a=e.raw},closestDataStack:N,skipDuringClone:qe,addRootSelector:Oe,addInitSelector:Se,addScopeToNode:M,deferMutations:function(){S=!0},mapAttributes:ce,evaluateLater:K,setEvaluator:function(e){U=e},mergeProxies:P,findClosest:$e,closestRoot:Ce,interceptor:T,transition:ze,setStyles:Ne,mutateDom:O,directive:X,throttle:Ke,debounce:Ve,evaluate:V,initTree:je,nextTick:ge,prefixed:G,prefix:function(e){J=e},plugin:function(e){e(Ge)},magic:D,store:function(e,t){if(He||(Ue=r(Ue),He=!0),void 0===t)return Ue[e];Ue[e]=t,"object"==typeof t&&null!==t&&t.hasOwnProperty("init")&&"function"==typeof t.init&&Ue[e].init(),R(Ue[e])},start:function(){var e;document.body||be("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` + @endpush + + @slot('title') + @lang('pages.details.page_name') + @endslot + +
+
+
+
+

@lang('pages.details.about')

+ +
+ + {{ $configuration['symbol'] }} + + + + {{ $configuration['token'] }} + + + + {{ Format::readableCrypto((int) $configuration['totalPremine']) }} + + + + {{ Format::readableCrypto((int) $configuration['rewardPerBlock']) }} {{ $configuration['token'] }} + + + + {{ $configuration['blocktime'] }} s + + + + {{ $configuration['transactionsPerBlock'] }} + + + + {{ $configuration['forgers'] }} + +
+
+ +
+

@lang ('pages.details.network_details')

+ +
+ +
+ {{ $configuration['mainnetPrefix'] }} + {{ $configuration['devnetPrefix'] }} + {{ $configuration['testnetPrefix'] }} +
+
+ + + {{ $configuration['p2pPort'] }} + + + + {{ $configuration['apiPort'] }} + + + + {{ $configuration['webhookPort'] }} + + + + {{ $configuration['explorerPort'] }} + +
+
+
+ +
+ @can ('delete', $token) + + @endcan + +
+ + + +
+
+
+ +
+

@lang ('pages.details.important_links.title')

+ +
+ + +
+

@lang ('pages.details.important_links.explorer.title')

+ +
+ @foreach (NetworkTypeEnum::all() as $network) + @if ($token->network($network)->hasGenesis()) + + @endif + @endforeach +
+
+
+
+ +
+

@lang ('pages.details.useful_resources.title')

+ +
+ @php ($usefulResources = collect(trans('pages.details.useful_resources.links'))->splitIn(2)) + + @foreach ($usefulResources as $links) +
+ @foreach ($links as $url => $label) +
+ +
+ @endforeach +
+ @endforeach +
+
+ + @livewire('delete-token') +
+@endcomponent diff --git a/resources/views/app/tokens/edit.blade.php b/resources/views/app/tokens/edit.blade.php new file mode 100644 index 0000000..548386b --- /dev/null +++ b/resources/views/app/tokens/edit.blade.php @@ -0,0 +1,9 @@ +@extends('layouts.app') + +@section('content') + +
+ +
+
+@endsection diff --git a/resources/views/app/tokens/index.blade.php b/resources/views/app/tokens/index.blade.php new file mode 100644 index 0000000..7a64271 --- /dev/null +++ b/resources/views/app/tokens/index.blade.php @@ -0,0 +1,9 @@ +@component('layouts.app', ['fullWidth' => true]) + + @section('content') + + @livewire('manage-tokens') + + @endsection + +@endcomponent diff --git a/resources/views/app/tokens/onboard.blade.php b/resources/views/app/tokens/onboard.blade.php new file mode 100644 index 0000000..878bf24 --- /dev/null +++ b/resources/views/app/tokens/onboard.blade.php @@ -0,0 +1,118 @@ +@extends('layouts.app') + +@section('content') + +
+
+

@lang('tokens.onboarding.page_header')

+

@lang('tokens.onboarding.page_subheader')

+
+ +
+
+
+
+ {{-- Customize Your Blockchain --}} + + + {{-- Connect Server Provider --}} + + + {{-- Server Configuration --}} + + + {{-- SSH Keys --}} + + + {{-- Invite Your Team --}} + + + {{-- Time to Deploy! --}} +
+ @if($token->onboarding()->fulfilled()) +
+ +
+ @else +
+ +
+ @endif +
! $token->onboarding()->fulfilled()])> + +

+ @lang('tokens.onboarding.deploy_your_blockchain_description') +

+
+
+
+ +
+ @can('delete', [Domain\Token\Models\Token::class, $token]) + + @endcan + + +
+ + + +
+
+
+
+
+@endsection diff --git a/resources/views/app/tokens/secure-shell-keys.blade.php b/resources/views/app/tokens/secure-shell-keys.blade.php new file mode 100644 index 0000000..48a5db7 --- /dev/null +++ b/resources/views/app/tokens/secure-shell-keys.blade.php @@ -0,0 +1,19 @@ +@component('layouts.token', ['token' => $token]) + @slot('title') + @lang('tokens.secure-shell-keys.page_header') + @endslot + +
+ @lang('tokens.secure-shell-keys.page_description') +
+ +
+
+ +
+ @livewire('manage-token-secure-shell-keys', ['token' => $token]) +
+@endcomponent diff --git a/resources/views/app/tokens/server-configuration.blade.php b/resources/views/app/tokens/server-configuration.blade.php new file mode 100644 index 0000000..6e7b754 --- /dev/null +++ b/resources/views/app/tokens/server-configuration.blade.php @@ -0,0 +1,13 @@ +@component('layouts.token', ['token' => $token]) + @slot('title') + @lang('tokens.server-configuration.page_header') + @endslot + +
+ @lang('tokens.server-configuration.page_description') +
+ +
+ @livewire('manage-server-configuration', ['token' => $token]) +
+@endcomponent diff --git a/resources/views/app/tokens/server-providers.blade.php b/resources/views/app/tokens/server-providers.blade.php new file mode 100644 index 0000000..288c2b4 --- /dev/null +++ b/resources/views/app/tokens/server-providers.blade.php @@ -0,0 +1,13 @@ +@component('layouts.token', ['token' => $token]) + @slot('title') + @lang('tokens.server-providers.page_header') + @endslot + +
+ @lang('tokens.server-providers.page_description') +
+ +
+ @livewire('manage-server-providers', ['token' => $token]) +
+@endcomponent diff --git a/resources/views/app/tokens/servers/create.blade.php b/resources/views/app/tokens/servers/create.blade.php new file mode 100644 index 0000000..6e72ae6 --- /dev/null +++ b/resources/views/app/tokens/servers/create.blade.php @@ -0,0 +1,8 @@ +@component('layouts.token', ['token' => $token]) + @slot('title') + @lang('actions.create_server') + @endslot + + @livewire('create-server', ['network' => $network]) + +@endcomponent diff --git a/resources/views/app/tokens/servers/index.blade.php b/resources/views/app/tokens/servers/index.blade.php new file mode 100644 index 0000000..a05abbc --- /dev/null +++ b/resources/views/app/tokens/servers/index.blade.php @@ -0,0 +1,13 @@ +@component('layouts.token', ['token' => $token]) + @push('scripts') + + @endpush + + @slot('title') + @lang('pages.token.servers.title') + @endslot + + + +@endcomponent + diff --git a/resources/views/app/tokens/servers/show.blade.php b/resources/views/app/tokens/servers/show.blade.php new file mode 100644 index 0000000..ab71a05 --- /dev/null +++ b/resources/views/app/tokens/servers/show.blade.php @@ -0,0 +1,7 @@ +@component('layouts.token', ['token' => $token, 'server' => $server]) + @slot('title') + @lang('pages.server.installation.page_name') + @endslot + + @livewire('server-deployment-tracker', ['token' => $token, 'serverId' => $server->id]) +@endcomponent diff --git a/resources/views/app/under-construction.blade.php b/resources/views/app/under-construction.blade.php new file mode 100644 index 0000000..7f13206 --- /dev/null +++ b/resources/views/app/under-construction.blade.php @@ -0,0 +1 @@ +Under Construction diff --git a/resources/views/app/user/settings/notifications.blade.php b/resources/views/app/user/settings/notifications.blade.php new file mode 100644 index 0000000..0e65665 --- /dev/null +++ b/resources/views/app/user/settings/notifications.blade.php @@ -0,0 +1,9 @@ +@component('layouts.app', ['fullWidth' => true]) + + @section('content') + + + + @endsection + +@endcomponent diff --git a/resources/views/app/user/settings/profile.blade.php b/resources/views/app/user/settings/profile.blade.php new file mode 100644 index 0000000..47b51f1 --- /dev/null +++ b/resources/views/app/user/settings/profile.blade.php @@ -0,0 +1,22 @@ +@component('layouts.user-settings') + + + + + + + + + + + + + + + +@endcomponent diff --git a/resources/views/app/user/settings/security.blade.php b/resources/views/app/user/settings/security.blade.php new file mode 100644 index 0000000..26aaffd --- /dev/null +++ b/resources/views/app/user/settings/security.blade.php @@ -0,0 +1,11 @@ +@component('layouts.user-settings', ['title' => trans('menus.user-settings.security')]) + @push('scripts') + + @endpush + + + + + + +@endcomponent diff --git a/resources/views/app/user/settings/ssh-keys.blade.php b/resources/views/app/user/settings/ssh-keys.blade.php new file mode 100644 index 0000000..d7cc445 --- /dev/null +++ b/resources/views/app/user/settings/ssh-keys.blade.php @@ -0,0 +1,9 @@ +@component('layouts.user-settings', ['title' => trans('menus.user-settings.ssh-keys')]) + @livewire('create-secure-shell-key') + + + + @livewire('manage-secure-shell-keys') + + @livewire('delete-secure-shell-key') +@endcomponent diff --git a/resources/views/app/user/settings/teams.blade.php b/resources/views/app/user/settings/teams.blade.php new file mode 100644 index 0000000..43b5c06 --- /dev/null +++ b/resources/views/app/user/settings/teams.blade.php @@ -0,0 +1,23 @@ +@component('layouts.app', ['fullWidth' => true, 'isLanding' => true]) + + @section('title', trans('pages.user-settings.teams.my_teams_title')) + + @section('content') + + + + + + + + + + + + + + @endsection +@endcomponent diff --git a/resources/views/components/blank.blade.php b/resources/views/components/blank.blade.php new file mode 100644 index 0000000..318d3b9 --- /dev/null +++ b/resources/views/components/blank.blade.php @@ -0,0 +1,3 @@ +
class('py-5 px-6 rounded-xl border border-theme-secondary-300') }}> + {{ $slot }} +
diff --git a/resources/views/components/blockchain-logo.blade.php b/resources/views/components/blockchain-logo.blade.php new file mode 100644 index 0000000..2e012c0 --- /dev/null +++ b/resources/views/components/blockchain-logo.blade.php @@ -0,0 +1,7 @@ +
+ @unless ($token->logo) + + @else +
+ @endunless +
diff --git a/resources/views/components/delete-modal.blade.php b/resources/views/components/delete-modal.blade.php new file mode 100644 index 0000000..2d0ca97 --- /dev/null +++ b/resources/views/components/delete-modal.blade.php @@ -0,0 +1,61 @@ +@props([ + 'actionMethod', + 'closeMethod', + 'title', + 'description', + 'image' => '/images/modal/question.svg', + 'canSubmit' => false, +]) + + + + {{ $title }} + + + +
+
+ {{ $title }} +
+ +
+ {{ $description }} +
+
+
+ + +
+ + + +
+
+
diff --git a/resources/views/components/divider.blade.php b/resources/views/components/divider.blade.php new file mode 100644 index 0000000..7f28f39 --- /dev/null +++ b/resources/views/components/divider.blade.php @@ -0,0 +1,10 @@ +@props ([ + 'spacing' => '12' +]) + +
class('border-t border-theme-secondary-300 border-dashed')->class([ + '4' => 'pt-4 mt-4', + '6' => 'pt-6 mt-6', + '8' => 'pt-8 mt-8', + '12' => 'pt-12 mt-12', +][$spacing] ?? 'pt-12 mt-12') }}> diff --git a/resources/views/components/grid.blade.php b/resources/views/components/grid.blade.php new file mode 100644 index 0000000..7124405 --- /dev/null +++ b/resources/views/components/grid.blade.php @@ -0,0 +1,14 @@ +
+
+

{{ $title }}

+
{{ $description }}
+
+ +
+
+
+ {{ $slot }} +
+
+
+
diff --git a/resources/views/components/griddy.blade.php b/resources/views/components/griddy.blade.php new file mode 100644 index 0000000..c75054e --- /dev/null +++ b/resources/views/components/griddy.blade.php @@ -0,0 +1,13 @@ +
+
+

{{ $title }}

+
+ +
+
+
+ {{ $slot }} +
+
+
+
diff --git a/resources/views/components/home/active-servers/action-dropdown.blade.php b/resources/views/components/home/active-servers/action-dropdown.blade.php new file mode 100644 index 0000000..f2201e9 --- /dev/null +++ b/resources/views/components/home/active-servers/action-dropdown.blade.php @@ -0,0 +1,101 @@ +@props([ + 'server', +]) + +
+ @if ($server->isProvisioned() || $server->isFailed()) + @canany(['start', 'stop', 'restart', 'rename', 'delete'], $server) +
+ + @if ($server->isProvisioned()) + @can ('rename', $server) + + @endcan + + @can ('start', $server) + + @endcan + + @can ('stop', $server) + + @endcan + + @can ('restart', $server) + + @endcan + + + @endif + + @can ('delete', $server) + + @endcan + +
+ @endcanany + @endif +
diff --git a/resources/views/components/home/active-servers/desktop-table.blade.php b/resources/views/components/home/active-servers/desktop-table.blade.php new file mode 100644 index 0000000..98df0b9 --- /dev/null +++ b/resources/views/components/home/active-servers/desktop-table.blade.php @@ -0,0 +1,123 @@ +@props([ + 'sortBy', + 'sortDirection', + 'servers', +]) + + diff --git a/resources/views/components/home/active-servers/desktop-tabs.blade.php b/resources/views/components/home/active-servers/desktop-tabs.blade.php new file mode 100644 index 0000000..5f5cfc7 --- /dev/null +++ b/resources/views/components/home/active-servers/desktop-tabs.blade.php @@ -0,0 +1,44 @@ +@props([ + 'networks', + 'default', +]) + + diff --git a/resources/views/components/home/active-servers/mobile-accordion.blade.php b/resources/views/components/home/active-servers/mobile-accordion.blade.php new file mode 100644 index 0000000..0174c41 --- /dev/null +++ b/resources/views/components/home/active-servers/mobile-accordion.blade.php @@ -0,0 +1,144 @@ +@props([ + 'servers', +]) + +
+ @foreach ($servers as $server) + @php($isProvisioned = $server->isProvisioned()) + @php($isFailed = $server->isFailed()) + @php($pathShow = $server->pathShow()) + + + + + {{ $server->name }} + + + +
+
+
+ @lang('tokens.networks.table_status') +
+ +
+
+
+ @lang('tokens.networks.table_ip_address') + @if($server->ip_address) +
+ {{ $server->ip_address }} + +
+ @else + @lang('tokens.networks.server_unavailable') + @endif +
+
+ @lang('tokens.networks.table_size') + {{ $server->plan->disk }} +
+
+ @lang('tokens.networks.table_region') + {{ $server->region->name }} +
+
+ @lang('tokens.networks.table_preset') + @if($isProvisioned && PresetTypeEnum::isExplorer($server->preset)) + + @else + {{ ucfirst($server->preset) }} + @endif +
+
+
+
+ @if ($isProvisioned) +
+ @if ($server->hasEverHadStatus('provisioning') || $isFailed) + @can('delete', [Domain\Server\Models\Server::class, $server]) + + @endcan + @endif + + @can('rename', [Domain\Server\Models\Server::class, $server]) + + @endcan +
+ + @canany(['start', 'stop', 'restart'], [Domain\Server\Models\Server::class, $server]) +
+ + @can('start', [Domain\Server\Models\Server::class, $server]) + + @endcan + @can('stop', [Domain\Server\Models\Server::class, $server]) + + @endcan + @can('restart', [Domain\Server\Models\Server::class, $server]) + + @endcan + +
+ @endcanany + @endif +
+
+
+
+ @endforeach +
diff --git a/resources/views/components/home/active-servers/mobile-dropdown.blade.php b/resources/views/components/home/active-servers/mobile-dropdown.blade.php new file mode 100644 index 0000000..05d96c5 --- /dev/null +++ b/resources/views/components/home/active-servers/mobile-dropdown.blade.php @@ -0,0 +1,64 @@ +@props([ + 'selected', + 'networks', +]) + +
+ + +
+
+
+ +
+ +
+ +
+
+ +
@lang('tokens.'.$selected->name)
+
+
+ +
+ @foreach ($networks as $network) + + @endforeach +
+
+
diff --git a/resources/views/components/home/active-servers/type-filter.blade.php b/resources/views/components/home/active-servers/type-filter.blade.php new file mode 100644 index 0000000..8a964c7 --- /dev/null +++ b/resources/views/components/home/active-servers/type-filter.blade.php @@ -0,0 +1,10 @@ +@props([ + 'mobile' => false, +]) + + diff --git a/resources/views/components/modals/expired-link-modal.blade.php b/resources/views/components/modals/expired-link-modal.blade.php new file mode 100644 index 0000000..3438362 --- /dev/null +++ b/resources/views/components/modals/expired-link-modal.blade.php @@ -0,0 +1,23 @@ +@props ([ + 'wire', + 'title', + 'message', +]) + + + + {{ $title }} + + + +
+ {{ $title }} +
+ +

{{ $message }}

+
+
diff --git a/resources/views/components/modals/invalid-link-modal.blade.php b/resources/views/components/modals/invalid-link-modal.blade.php new file mode 100644 index 0000000..2f80513 --- /dev/null +++ b/resources/views/components/modals/invalid-link-modal.blade.php @@ -0,0 +1,23 @@ +@props ([ + 'wire', + 'title', + 'message', +]) + + + + {{ $title }} + + + +
+ {{ $title }} +
+ +

{{ $message }}

+
+
diff --git a/resources/views/components/onboard-step.blade.php b/resources/views/components/onboard-step.blade.php new file mode 100644 index 0000000..55780f8 --- /dev/null +++ b/resources/views/components/onboard-step.blade.php @@ -0,0 +1,39 @@ +@php($isCompleted = $token->onboarding()->completed($name)) +@php($isAvailable = $token->onboarding()->available($name)) + +
+ @if($isCompleted) +
+ +
+ @elseif($isAvailable) +
+ +
+ @else +
+ +
+ @endif +
+
+ @if($isCompleted || $isAvailable) + + {{ $title }} + + @else + + {{ $title }} + + @endif + @if($optional ?? false) + Optional + @endif +
+
{{ $description }}
+
+
diff --git a/resources/views/components/pending-invitations.blade.php b/resources/views/components/pending-invitations.blade.php new file mode 100644 index 0000000..bdf59db --- /dev/null +++ b/resources/views/components/pending-invitations.blade.php @@ -0,0 +1,160 @@ +@if($invitationsCount) +
+
+

@lang('pages.user-settings.teams.pending_title')

+ @lang('pages.user-settings.teams.pending_description') +
+ + @if (session('status') === TokenInvitationController::ALERT_STATUS) + + @endif + +
+
    + @foreach($currentUser->invitations as $invitation) +
  • +
    +
    +
    + @lang('tables.blockchain_name') +
    +
    + {{ $invitation->token->name }} +
    +
    +
    +
    + @lang('tables.invited_by') +
    +
    + {{ $invitation->token->user->name }} +
    +
    +
    +
    + @lang('tables.role') +
    +
    + +
    +
    +
    +
    + @lang('tables.date_invited') +
    +
    + {{ $invitation->token->created_at_local->format(DateFormat::DATE) }} +
    +
    +
    + +
    + + @lang('actions.accept') + + + +
    + @unless ($loop->last) + + @endunless +
  • + @endforeach +
+ + +
+
+
+@endif diff --git a/resources/views/components/profile/keys/desktop.blade.php b/resources/views/components/profile/keys/desktop.blade.php new file mode 100644 index 0000000..e913dfb --- /dev/null +++ b/resources/views/components/profile/keys/desktop.blade.php @@ -0,0 +1,47 @@ +@props (['keys']) + + + + + + {{ trans('tables.name') }} + + + + {{ trans('tables.fingerprint') }} + + + + {{ trans('tables.date_added') }} + + + + + + + + @foreach ($keys as $key) + + + + {{ $key->name }} + + + + + + {{ $key->fingerprint }} + + + + {{ $key->created_at_local->format(DateFormat::DATE) }} + + + + + + @endforeach + + diff --git a/resources/views/components/profile/keys/item.blade.php b/resources/views/components/profile/keys/item.blade.php new file mode 100644 index 0000000..4984a06 --- /dev/null +++ b/resources/views/components/profile/keys/item.blade.php @@ -0,0 +1,11 @@ +@props (['label']) + +
class('flex justify-between space-x-6') }}> +
+ {{ $label }} +
+ +
+ {{ $slot }} +
+
diff --git a/resources/views/components/profile/keys/mobile.blade.php b/resources/views/components/profile/keys/mobile.blade.php new file mode 100644 index 0000000..5d7ae6e --- /dev/null +++ b/resources/views/components/profile/keys/mobile.blade.php @@ -0,0 +1,32 @@ +@props (['keys']) + +
+ @foreach ($keys as $key) +
+ + + {{ $key->name }} + + + + + + {{ $key->fingerprint }} + + + + + {{ $key->created_at_local->format(DateFormat::DATE) }} + + +
+ +
+
+ @endforeach +
diff --git a/resources/views/components/server-providers/desktop.blade.php b/resources/views/components/server-providers/desktop.blade.php new file mode 100644 index 0000000..4ba7946 --- /dev/null +++ b/resources/views/components/server-providers/desktop.blade.php @@ -0,0 +1,52 @@ +@props (['providers']) + + + + + + {{ trans('tables.name') }} + + + + {{ trans('tables.date_added') }} + + + + + + + + @foreach ($providers as $provider) + + +
+ + + + + + {{ $provider->name }} + +
+
+ + {{ $provider->created_at_local->format(DateFormat::DATE) }} + + +
+ +
+
+
+ @endforeach + +
diff --git a/resources/views/components/server-providers/item.blade.php b/resources/views/components/server-providers/item.blade.php new file mode 100644 index 0000000..4984a06 --- /dev/null +++ b/resources/views/components/server-providers/item.blade.php @@ -0,0 +1,11 @@ +@props (['label']) + +
class('flex justify-between space-x-6') }}> +
+ {{ $label }} +
+ +
+ {{ $slot }} +
+
diff --git a/resources/views/components/server-providers/mobile.blade.php b/resources/views/components/server-providers/mobile.blade.php new file mode 100644 index 0000000..b57098b --- /dev/null +++ b/resources/views/components/server-providers/mobile.blade.php @@ -0,0 +1,35 @@ +@props (['providers']) + +
+ @foreach ($providers as $provider) +
+ +
+ + + + + + {{ $provider->name }} + +
+
+ + + {{ $provider->created_at_local->format(DateFormat::DATE) }} + + + @can ('delete', $provider) +
+ +
+ @endcan +
+ @endforeach +
diff --git a/resources/views/components/server-providers/select.blade.php b/resources/views/components/server-providers/select.blade.php new file mode 100644 index 0000000..5dd89c3 --- /dev/null +++ b/resources/views/components/server-providers/select.blade.php @@ -0,0 +1,61 @@ +@props ([ + 'provider', + 'enabled', +]) + +@if ($enabled) +
+
+
+
+ +
+ +
+
+@else +
+
+
+
+ +
+ {{ trans('actions.coming_soon') }} +
+
+@endif diff --git a/resources/views/components/servers/status.blade.php b/resources/views/components/servers/status.blade.php new file mode 100644 index 0000000..72e8bc0 --- /dev/null +++ b/resources/views/components/servers/status.blade.php @@ -0,0 +1,21 @@ +@props ([ + 'server' +]) + +
class('flex items-center space-x-2') }}> + @if ($server->isOffline()) + + {{ trans('pages.server.status.offline') }} + @elseif ($server->isFailed()) + + {{ trans('pages.server.status.failed') }} + @elseif ($server->isProvisioned()) + + {{ trans('pages.server.status.online') }} + @else + + + {{ trans('pages.server.status.provisioning') }} + + @endif +
diff --git a/resources/views/components/sort-by-button.blade.php b/resources/views/components/sort-by-button.blade.php new file mode 100644 index 0000000..c87fbb2 --- /dev/null +++ b/resources/views/components/sort-by-button.blade.php @@ -0,0 +1,11 @@ + diff --git a/resources/views/components/token-sidebar-links.blade.php b/resources/views/components/token-sidebar-links.blade.php new file mode 100644 index 0000000..d9bae8b --- /dev/null +++ b/resources/views/components/token-sidebar-links.blade.php @@ -0,0 +1,51 @@ + + + + + + +@canany(['createCollaborator', 'deleteCollaborator'], [Domain\Token\Models\Token::class, $token]) + +@endcanany + + + + + + diff --git a/resources/views/components/token-slider-placeholder.blade.php b/resources/views/components/token-slider-placeholder.blade.php new file mode 100644 index 0000000..4019d19 --- /dev/null +++ b/resources/views/components/token-slider-placeholder.blade.php @@ -0,0 +1,12 @@ + +
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/views/components/token-slider.blade.php b/resources/views/components/token-slider.blade.php new file mode 100644 index 0000000..24c75e0 --- /dev/null +++ b/resources/views/components/token-slider.blade.php @@ -0,0 +1,41 @@ +
+ + @foreach ($tokens as $token) + +
+
+ +
{{ $token->name }}
+
+ + + {{ $token->servers_count }} + + + + @if ($token->hasProvisionedGenesisServer()) + + @else + + @endif + {{ $token->hasProvisionedGenesisServer() ? trans('pages.manage-tokens.status_deployed_short') : trans('pages.manage-tokens.status_pending_short') }} + +
+
+ + +
+
+ @endforeach + @for ($i = $tokens->count(); $i < 4; $i++) + + @endfor +
+
diff --git a/resources/views/components/tokens/details-item.blade.php b/resources/views/components/tokens/details-item.blade.php new file mode 100644 index 0000000..2399932 --- /dev/null +++ b/resources/views/components/tokens/details-item.blade.php @@ -0,0 +1,9 @@ +@props (['title']) + +
class('flex justify-between py-3') }}> +
{{ $title }}:
+ +
+ {{ $slot }} +
+
diff --git a/resources/views/components/tokens/heading.blade.php b/resources/views/components/tokens/heading.blade.php new file mode 100644 index 0000000..419989f --- /dev/null +++ b/resources/views/components/tokens/heading.blade.php @@ -0,0 +1,16 @@ +@props ([ + 'title', + 'description', + 'link' => null, +]) + +
+

{{ $title }}

+

{{ $description }}

+ + @if ($link) +
+ +
+ @endif +
diff --git a/resources/views/components/tokens/onboard-buttons.blade.php b/resources/views/components/tokens/onboard-buttons.blade.php new file mode 100644 index 0000000..7b0ad1c --- /dev/null +++ b/resources/views/components/tokens/onboard-buttons.blade.php @@ -0,0 +1,50 @@ +
class('flex flex-col-reverse sm:flex-row justify-end items-center w-full sm:space-x-3') }}> + @if($showCancel ?? true) + + @lang('actions.cancel') + + @endif + + @if($step ?? false) + @if (! $token || $token->onboarding()->isStep(Format::stepTitle($step))) + @unless($submitButton ?? false) + + {{ $title ?? trans('actions.save_continue') }} + + @else +
diff --git a/resources/views/components/tokens/sidebar-divider.blade.php b/resources/views/components/tokens/sidebar-divider.blade.php new file mode 100644 index 0000000..6e87577 --- /dev/null +++ b/resources/views/components/tokens/sidebar-divider.blade.php @@ -0,0 +1 @@ +
class('border-t border-dashed border-theme-secondary-300 mr-4') }}>
diff --git a/resources/views/components/tokens/step-indicator.blade.php b/resources/views/components/tokens/step-indicator.blade.php new file mode 100644 index 0000000..fd4db63 --- /dev/null +++ b/resources/views/components/tokens/step-indicator.blade.php @@ -0,0 +1,11 @@ +@props ([ + 'active', + 'current', +]) + +
$active === $current, + 'text-theme-secondary-500 border-theme-warning-500' => $active > $current, + 'text-theme-secondary-500 border-theme-secondary-200' => $active < $current, +])>
diff --git a/resources/views/components/tokens/subheading.blade.php b/resources/views/components/tokens/subheading.blade.php new file mode 100644 index 0000000..f8aed40 --- /dev/null +++ b/resources/views/components/tokens/subheading.blade.php @@ -0,0 +1,36 @@ +@props ([ + 'title', + 'description' => null, + 'fields' => null, + 'wire' => null, +]) + +
+
+

+ {{ $title }} +

+ + +
+ + @if ($description) +
+

{{ $description }}

+
+ @endif +
diff --git a/resources/views/components/truncated-cell.blade.php b/resources/views/components/truncated-cell.blade.php new file mode 100644 index 0000000..a98887b --- /dev/null +++ b/resources/views/components/truncated-cell.blade.php @@ -0,0 +1,6 @@ +
merge(['class' => 'relative']) }}> + + {{ $slot }} + + +
diff --git a/resources/views/components/user-teams.blade.php b/resources/views/components/user-teams.blade.php new file mode 100644 index 0000000..b740a65 --- /dev/null +++ b/resources/views/components/user-teams.blade.php @@ -0,0 +1,154 @@ +
+
+

@lang('pages.user-settings.teams.my_teams_title')

+ @lang('pages.user-settings.teams.my_teams_description') +
+ + @if (session('status') === LeaveTeamModal::ALERT_STATUS) + + @endif + +
+ @if($currentUser->tokens->isNotEmpty()) +
+
    + @foreach($currentUser->tokens as $token) +
  • +
    +
    +
    + +
    +
    + {{ $token->name }} +
    +
    +
    +
    + @lang('tables.role') +
    +
    + +
    +
    +
    +
    + @lang('tables.date_invited') +
    +
    + {{ $token->created_at_local->format(DateFormat::DATE) }} +
    +
    +
    + +
    + ownsToken($token)) + data-tippy-content="{{ trans('pages.user-settings.teams.leave_owner') }}" + data-tippy-trigger="mouseenter" + @endif + > + + +
    + @unless ($loop->last) + + @endunless +
  • + @endforeach +
+ + +
+ @else +
+
+ @lang('pages.user-settings.no_current_teams') +
+ +
+ + + +
+
+ @endif +
+
diff --git a/resources/views/components/welcome-screens.blade.php b/resources/views/components/welcome-screens.blade.php new file mode 100644 index 0000000..823d514 --- /dev/null +++ b/resources/views/components/welcome-screens.blade.php @@ -0,0 +1,147 @@ +
+ + +
+
+

{{ trans('pages.welcome.intro.title') }}

+
+ +
+ +
+ +
+

{{ trans('pages.welcome.intro.description') }}

+
+
+ +
+ + @for ($i = 0; $i < 3; $i++) + +
+

{{ trans('pages.welcome.slide'.$i.'.title') }}

+
+ +
+ +
+ +
+

{{ trans('pages.welcome.slide'.$i.'.description') }}

+
+
+ @endfor + + {{-- Video slide --}} + {{-- +
+

{{ trans('pages.welcome.slide3.title') }}

+
+ +
+ +
+ +
+

{{ trans('pages.welcome.slide3.description') }}

+
+
--}} +
+
+
+ + +
+
+ +
+ +
+ + + +
+
+ +
+
+ @for ($i = 0; $i < 3; $i++) + + @endfor +
+ +
+ + + + + +
+
+
+
+
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..ae243fc --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,84 @@ + + + + + + + + + @auth + + @livewire('notifications-indicator') + + + + + + @endauth + + + +
+ {{ config('app.name') }} +
+ + +
+
+
+ + + + +
+ diff --git a/resources/views/layouts/server.blade.php b/resources/views/layouts/server.blade.php new file mode 100644 index 0000000..a2ddcaa --- /dev/null +++ b/resources/views/layouts/server.blade.php @@ -0,0 +1,45 @@ +@extends('layouts.app') + +@section('content') + +
+

{{ $server->name }}

+
+ +
+
+
+
+
+
+ + @lang('menus.menu') +
+ + +
+
+ +
+
+ +
+ {{ $slot }} +
+
+
+
+
+@endsection diff --git a/resources/views/layouts/token.blade.php b/resources/views/layouts/token.blade.php new file mode 100644 index 0000000..1491b48 --- /dev/null +++ b/resources/views/layouts/token.blade.php @@ -0,0 +1,67 @@ +@extends('layouts.app') + +@push('scripts') + +@endpush + +@section('content') + +
+ @unless($token->canBeEdited()) +
+
+
+ +
+ +
+ + @lang('tokens.token') + + + + {{ $token->name }} + +
+
+ +
+ @endunless + +
+ @unless($token->canBeEdited()) + + + + + + @endunless +
+
+ +
+

{{ $title ?? '' }}

+
{{ $slot }}
+
+
+@endsection diff --git a/resources/views/layouts/user-settings.blade.php b/resources/views/layouts/user-settings.blade.php new file mode 100644 index 0000000..18a05dd --- /dev/null +++ b/resources/views/layouts/user-settings.blade.php @@ -0,0 +1,29 @@ +@extends('layouts.app') + +@section('content') + + + +
+
+ + + + + + + +
+ + @if (($title ?? null) !== false) +

{{ $title ?? trans('pages.user-settings.page_name') }}

+ @endif + +
{{ $slot }}
+
+
+@endsection diff --git a/resources/views/livewire/active-servers.blade.php b/resources/views/livewire/active-servers.blade.php new file mode 100644 index 0000000..0895a30 --- /dev/null +++ b/resources/views/livewire/active-servers.blade.php @@ -0,0 +1,80 @@ +@php($hasSecureShellKeys = $selectedToken->hasSecureShellKeys()) +@php($hasServerProviders = $selectedToken->hasServerProviders()) +@php($needsServerConfiguration = $selectedToken->needsServerConfiguration()) +@php($hasGenesis = $selectedNetwork->hasGenesis()) + +@if(!$hasSecureShellKeys || !$hasServerProviders || $needsServerConfiguration) + + {!! trans('tokens.networks.onboarding_incomplete', ['route' => route('tokens.welcome', $selectedToken)]) !!} + +@endif + +@if($hasSecureShellKeys && $hasServerProviders && $selectedToken->hasAuthorizedKeys() && ! $needsServerConfiguration) +
+ @if($title) +

{{ $title }}

+ @endif + + + + + +
+ +
+ + @if($selectedNetworkServers->count() > 0) + @if(! $hasGenesis) + + @endif + +
+ +
+ +
+ +
+ + + @else +
+ @lang('tokens.networks.no_servers_created') +
+ @endif + + @if($selectedToken->allows($this->user, 'server:create') && $selectedToken->hasAnyIndexedServerProvider()) + @if($hasGenesis && !$selectedNetwork->hasProvisionedGenesis()) +
+ @lang('pages.manage-tokens.no_provisioned_genesis') +
+ @else +
+ + @lang('pages.manage-tokens.add_server_description') +
+ @endif + @endif +
+@endif + +@livewire('delete-server', ['token' => $selectedToken, 'network' => $selectedNetwork], key('delete-server-' . $selectedToken->id . '-' . $selectedNetwork->id)) + +@livewire('rename-server', ['token' => $selectedToken, 'network' => $selectedNetwork], key('rename-server-' . $selectedToken->id . '-' . $selectedNetwork->id)) diff --git a/resources/views/livewire/collaborator-permissions-modal.blade.php b/resources/views/livewire/collaborator-permissions-modal.blade.php new file mode 100644 index 0000000..913d570 --- /dev/null +++ b/resources/views/livewire/collaborator-permissions-modal.blade.php @@ -0,0 +1,32 @@ +
+ @if ($this->modalShown) + + @slot('title') @lang('pages.user-settings.role_permissions_title') @endslot + + @slot('description') +
+
+ @foreach($this->availablePermissions as $permission) +
+ @if($this->permissions === [] || in_array($permission, $this->permissions)) + + @else + + @endif + + {{ trans('pages.collaborators.permissions.'.$permission) }} +
+ @endforeach +
+
+ @endslot + + @slot('buttons') +
+ +
+ @endslot +
+ @endif +
+ diff --git a/resources/views/livewire/create-secure-shell-key.blade.php b/resources/views/livewire/create-secure-shell-key.blade.php new file mode 100644 index 0000000..25f4dd3 --- /dev/null +++ b/resources/views/livewire/create-secure-shell-key.blade.php @@ -0,0 +1,15 @@ +
+

@lang('pages.user-settings.create_ssh_title')

+

@lang('pages.user-settings.create_ssh_description')

+ +
+
+ + +
+ +
+ +
+
+
diff --git a/resources/views/livewire/create-server.blade.php b/resources/views/livewire/create-server.blade.php new file mode 100644 index 0000000..d848978 --- /dev/null +++ b/resources/views/livewire/create-server.blade.php @@ -0,0 +1,136 @@ +
+ @push('scripts') + + @endpush + +
+ +
+ +
+ + + @foreach ($this->getUniqueProviders() as $providerOption) + +
+
+
+
+
+ +
+
+
+ @endforeach +
+
+ + @if ($this->hasMultipleKeysOnProvider) +
+ + + + @foreach($this->providerEntries as $option) + @if ($option->allIndexed()) + + @else + + @endif + @endforeach + +
+ @endif + + @if($network->servers_count > 0) +
+ +
+
+
+ @foreach($this->presets as $presetOption) +
+
+ {{ Str::title($presetOption) }} +
+
+ +
+
+ @endforeach +
+
+ @endif + +
+ @if($preset === PresetTypeEnum::FORGER) + + @lang('forms.create_server.passphrases_warning') + +
+ +
+
+ +
+ @endif +
+ + @if(! empty($selectedProvider)) +
+ + + @endforeach + +
+ +
+ + + + @if ($this->region) + @foreach($this->formattedPlans as $option) + + @endforeach + @endif + +
+ @endif + +
+ + + +
+
diff --git a/resources/views/livewire/create-token-modal.blade.php b/resources/views/livewire/create-token-modal.blade.php new file mode 100644 index 0000000..a1c5d64 --- /dev/null +++ b/resources/views/livewire/create-token-modal.blade.php @@ -0,0 +1,44 @@ +
+ @if ($this->token) + + +
+
+ {{ trans('actions.create_token') }} +
+ + + {{ trans('tokens.create_token_modal.description1') }} + + +
+ +
+ +

{{ trans('tokens.create_token_modal.description2') }}

+
+
+ + +
+ + + +
+
+
+ @endif +
diff --git a/resources/views/livewire/decline-invitation-modal.blade.php b/resources/views/livewire/decline-invitation-modal.blade.php new file mode 100644 index 0000000..8b17718 --- /dev/null +++ b/resources/views/livewire/decline-invitation-modal.blade.php @@ -0,0 +1,39 @@ +
+ @if ($this->invitationId) + + @slot('title') @lang('pages.user-settings.teams.decline_title') @endslot + + @slot('description') +
+
+ +
+ + +
+ @endslot + + @slot('buttons') +
+ + +
+ @endslot +
+ @endif +
+ diff --git a/resources/views/livewire/delete-collaborator.blade.php b/resources/views/livewire/delete-collaborator.blade.php new file mode 100644 index 0000000..28fc57b --- /dev/null +++ b/resources/views/livewire/delete-collaborator.blade.php @@ -0,0 +1,28 @@ +
+ @if($this->collaboratorId) + + @slot('title') + @lang('tokens.remove_collaborator') + @endslot + + @slot('description') +
+
+ +
+
@lang('tokens.are_you_sure_you_want_to_delete_collaborator')
+
+ @endslot + + @slot('buttons') +
+ + +
+ @endslot +
+ @endif +
diff --git a/resources/views/livewire/delete-secure-shell-key.blade.php b/resources/views/livewire/delete-secure-shell-key.blade.php new file mode 100644 index 0000000..2821cd0 --- /dev/null +++ b/resources/views/livewire/delete-secure-shell-key.blade.php @@ -0,0 +1,12 @@ +
+ @if ($this->keyId) + + @endif +
diff --git a/resources/views/livewire/delete-server-provider.blade.php b/resources/views/livewire/delete-server-provider.blade.php new file mode 100644 index 0000000..1eaffbd --- /dev/null +++ b/resources/views/livewire/delete-server-provider.blade.php @@ -0,0 +1,65 @@ +
+ @if ($this->serverProviderId && $this->modalShown) + + +
+
+ {{ trans('tokens.server-providers.remove_server_provider_title') }} +
+ +

+ {{ trans('tokens.server-providers.remove_server_provider_description') }} +

+ + + + +
+
+ + +
+ + + +
+
+
+ @endif +
diff --git a/resources/views/livewire/delete-server.blade.php b/resources/views/livewire/delete-server.blade.php new file mode 100644 index 0000000..5982569 --- /dev/null +++ b/resources/views/livewire/delete-server.blade.php @@ -0,0 +1,28 @@ +
+ @if($this->serverId) + + @slot('title') + @lang('tokens.servers.remove_server_title') + @endslot + + @slot('description') +
+
+ +
+
@lang('tokens.servers.remove_server_description')
+
+ @endslot + + @slot('buttons') +
+ + +
+ @endslot +
+ @endif +
diff --git a/resources/views/livewire/delete-token.blade.php b/resources/views/livewire/delete-token.blade.php new file mode 100644 index 0000000..9b6c18a --- /dev/null +++ b/resources/views/livewire/delete-token.blade.php @@ -0,0 +1,69 @@ +
+ @if($this->tokenId) + + @slot('title') + @lang('actions.delete_token') + @endslot + + @slot('description') +
+ @lang('tokens.delete_token_modal.description') +
+
+
+ @foreach($this->options as $key => $option) + @if ($key === 'blockchain') +
+ @else +
+ @endif +
+
+
+ selectedOptions) ? 'checked' : '' }} + @if($this->shouldBeDisabled($key)) disabled @endif + /> +
+
+ +

{{ $option }}

+
+
+
+
+ @endforeach +
+
+ +
+ @lang('tokens.delete_token_modal.name') +
+ +
+ +
+ @endslot + + @slot('buttons') +
+ + +
+ @endslot + + @endif +
diff --git a/resources/views/livewire/deploy-blockchain.blade.php b/resources/views/livewire/deploy-blockchain.blade.php new file mode 100644 index 0000000..bc140d8 --- /dev/null +++ b/resources/views/livewire/deploy-blockchain.blade.php @@ -0,0 +1,54 @@ +
+ @if($this->tokenId) + + @slot('title') + @lang('actions.deploy_blockchain') + @endslot + + @slot('description') +
+ @lang('tokens.deploy_blockchain_modal.description') +
+
+
+ @foreach($this->options as $key => $option) +
+
+
+
+ selectedOption === $key ? 'checked' : '' }} + /> +
+ +
+ +

{{ $option }}

+
+
+
+
+ @endforeach +
+
+ @endslot + + @slot('buttons') +
+ + +
+ @endslot +
+ @endif +
diff --git a/resources/views/livewire/download-install-script.blade.php b/resources/views/livewire/download-install-script.blade.php new file mode 100644 index 0000000..dfa19ea --- /dev/null +++ b/resources/views/livewire/download-install-script.blade.php @@ -0,0 +1,30 @@ +
+ @php($availableNetworks = $this->availableNetworks()) + @php($hasAvailableNetworks = count($availableNetworks) > 0) + + + + + + @lang('actions.install_script') + +
+ @foreach($availableNetworks as $network) +
+ {{ ucfirst($network) }} +
+ @endforeach +
+
+
diff --git a/resources/views/livewire/invite-collaborator.blade.php b/resources/views/livewire/invite-collaborator.blade.php new file mode 100644 index 0000000..983034c --- /dev/null +++ b/resources/views/livewire/invite-collaborator.blade.php @@ -0,0 +1,47 @@ +
+

{{ trans('pages.collaborators.send_invitation_title') }}

+

{{ trans('pages.collaborators.send_invitation_description', ['appName' => config('app.name')]) }}

+ +
+
+ +
+ + + +
+ + @lang('forms.invite_collaborator.permissions') + +
+ @lang('actions.select_all') + @lang('actions.deselect_all') +
+
+ +
+ @foreach ($this->availablePermissions as $permission) +
+ +
+ @endforeach +
+ +
+ @error('permissions') +

{{ $message }}

+ @enderror +
+
+ +
+ +
+ +
diff --git a/resources/views/livewire/leave-team-modal.blade.php b/resources/views/livewire/leave-team-modal.blade.php new file mode 100644 index 0000000..938d014 --- /dev/null +++ b/resources/views/livewire/leave-team-modal.blade.php @@ -0,0 +1,36 @@ +
+ @if ($this->tokenId) + + @slot('title') @lang('pages.user-settings.teams.leave_title') @endslot + + @slot('description') +
+
+ +
+ + +
+ @endslot + + @slot('buttons') +
+ + +
+ @endslot +
+ @endif +
+ diff --git a/resources/views/livewire/logo-upload.blade.php b/resources/views/livewire/logo-upload.blade.php new file mode 100644 index 0000000..b5c52b7 --- /dev/null +++ b/resources/views/livewire/logo-upload.blade.php @@ -0,0 +1,23 @@ +